熊Sir
IP:
0关注数
23粉丝数
0获得的赞
工作年
编辑资料
链接我:

创作·27

全部
问答
动态
项目
学习
专栏
熊Sir

selenium学习使用操作大全(Python版)——其他问题

其他问题1、svg定位问题描述:使用xpath方法对svg下元素进行定位,会发现无法定位到svg下的元素:driver.find_element(xpath,"/html/body/div[19]/svg")解决方法1【错误】:从svg元素开始,下面的元素都要以*[name()=‘svg element’] 这种形式进行编写driver.find_element(xpath,"/html/body/div[19]/*[name()='svg']/*[name()='path']")会发现仍然定位不到;解决办法2【正确】:绝对路径的话,*[name()='svg']前面得加双斜杠,不然定位不到:driver.find_element(xpath,"/html/body/div[19]//*[name()='svg']")相对路径的话,*[name()='svg']前就不用加双斜杠,只用单斜杠:driver.find_element(xpath,"//*[@id='userinfo']/*[name()='svg']/*[name()='use']")2、处理chrome显示通知弹框使用chrome打开weibo.com会出现以下界面的弹出框:这东西不属于页面alert弹框,而是属于浏览器的设置项。要关掉它,需要对浏览器进行属于配置。具体见下面脚本:from selenium import webdriver options = webdriver.ChromeOptions() prefs = { 'profile.default_content_setting_values':{ 'notifications':2 } } options.add_experimental_option('prefs',prefs) driver = webdriver.Chrome(options = options) driver.get("https://blog.csdn.net/testleaf/article/details/123269042")3、获取元素的文本①element.text②get_attribute(“textContent”)优点:可以获取隐藏元素的文本缺点:IE不支持;获取有些元素的文本时,结果中带有空字符串;(没有尝试过)③get_attribute("innerText")优点:可以获取隐藏元素的文本缺点:FireFox不支持;(每个博客能搜到的都说这个缺点,但实际操作发现可以获取到每次所需的文本)4、切换网址直接进行切换就可以了,如下:driver.get('https://blog.csdn.net/testleaf/article/details/123269042') time.sleep(2) driver.get('https://blog.csdn.net/testleaf/article/details/123302863')5、find_element_by_xpath()被弃用解决方案from selenium.webdriver.common.by import By from selenium import webdriver driver = webdriver.Chrome() #启动chromedriver driver.get('http://www.baidu.com') #打开http://www.baidu.com driver.find_element(By.XPATH,'//div[@class="detail-item-ctn"][1]').click() #点击按钮
0
0
0
浏览量2021
熊Sir

selenium学习使用操作大全(Python版)——selenium基本操作

selenium基本操作Pycharm-Terminal操作:IPYTHON from selenium import webdriver driver = webdriver.Chrome() driver.get('https://www.baidu.com') driver.quit() exit()浏览器-Console操作:1、元素定位八种方法传说中的八大元素定位方法:driver.find_element_by_id() # 通过id属性定位(唯一);常用 driver.find_element_by_xpath() # 通过xpath表达式定位;常用 driver.find_element_by_class_name() # 通过类名定位;常用 driver.find_element_by_name() # 通过name属性定位 driver.find_element_by_tag_name() # 通过标签名定位 driver.find_element_by_css_selector() # 通过css选择器定位 driver.find_element_by_link_text() # 通过链接标签的text类容定位 driver.find_element_by_partial_link_text() # 通过匹配链接标签的text类容定位以上方法只会返回匹配到的第一个元素;返回的是 selenium.webdriver.remote.webelement.WebElement的对象;返回多个元素在element后加s即可,例如:driver.find_elements_by_xpath(),使用时要小心;凡是elements的方法返回的是列表;from selenium import webdriver driver = webdriver.Chrome() # 打开百度页面 driver.get('https://www.baidu.com') # 1. 获取搜索框 search_input = driver.find_element_by_id('kw') print(type(search_input)) print('1.搜索框的name属性值=', search_input.get_attribute('name')) # 2. 搜索按钮 search_btn = driver.find_element_by_xpath('//input[@value="百度一下"]') print('2.搜索按钮的id=', search_btn.get_attribute('id')) # 3. 百度logo logo = driver.find_element_by_class_name('index-logo-src') print('3.百度logo的src=', logo.get_attribute('src')) # 4. 通过name属性定位搜索框 search_input_by_name = driver.find_element_by_name('wd') print('4.搜索框的id=', search_input_by_name.get_attribute('id')) # 5. 热搜榜中的链接 hot_ul = driver.find_element_by_xpath('//ul[@id="hotsearch-content-wrapper"]') # hot_ul = driver.find_element_by_xpath('//ul[@text()="热榜"]') hot_a_s = hot_ul.find_element_by_tag_name('a') print('5.热搜榜第一的标题是:', hot_a_s.text) # 6. 通过css选择器定位搜索框 search_input_by_css = driver.find_element_by_css_selector('#kw') print('6.搜索框的name=', search_input_by_css.get_attribute('name')) # 7. 新闻栏目 el_a = driver.find_element_by_link_text('新闻') print('7.新闻栏目的url=', el_a.get_attribute('href')) # 8. 通过部分text匹配新闻栏目 el_a1 = driver.find_element_by_partial_link_text('新') print('8.新闻栏目的url=', el_a1.get_attribute('href')) driver.quit()2、元素动态定位问题:元素的定位方式不确定,可能是id,可能是xpath,需要通过不同的方式动态指定定位方法;办法:加判断语句,不需要我们写,selenium底层定位就是这么做的;driver.find_element(by,value) driver.find_elements(by,value)by: 定位方式value: 定位表达式import time from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() # 打开百度页面 driver.get('https://www.baidu.com') id_loc = 'kw' xpath_loc = '//input[@id="kw"]' e1 = driver.find_element(By.ID, id_loc) # send_keys往输入框输入文本 e1.send_keys('我通过id定位') time.sleep(3) # e2 = driver.find_element(By.XPATH, xpath_loc) e2 = driver.find_element('xpath', xpath_loc) e2.clear() # 清空原有内容 e2.send_keys('我通过xpath定位') time.sleep(3) driver.quit()3、iframe切换当页面中包含iframe时,不能直接操作iframe中的元素,需要先切换进iframe才行;selenium通过driver.switch_to.frame(frame_reference)来切换;selenium切换iframe有三种方式:1.通过webelement:使用webelement进行切换是最灵活的选择,先定位到iframe然后切换到它;2.通过name或id:iframe一般都会有id或name属性,则可以使用该属性进行切换,如果name或id在页面上不唯一,name将切换到找到的第一个;3.通过iframe在页面中的索引进行切换(从0开始):在浏览器console调试工具中使用window.ampInaboxIframes可以查询当前页面中的iframe;退出iframe:driver.switch_to.default_content();import time from selenium import webdriver # 使用with语句进行上下文管理 # 异常时也会关闭浏览器驱动 with webdriver.Chrome() as driver: driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_form_radio') # 切换iframe # 1. webelement的方式 # 先获取到iframe iframe = driver.find_element_by_id('iframeResult') # 再切换到 driver.switch_to.frame(iframe) # 2. name/id的方式 # 直接通过name/id切换 driver.switch_to.frame('iframeResult') # 3. 使用索引 # 切换到第二个iframe time.sleep(1) driver.switch_to.frame(1) # 找到female单选框 female = driver.find_element_by_xpath('//input[@value="female"]') print(female) # 4. 离开iframe,回到主页面 driver.switch_to.default_content() driver.find_element_by_xpath('//a[text()="运行代码"]')4、填充表单_填充文本框import time from selenium import webdriver with webdriver.Chrome() as driver: driver.get('https://www.baidu.com') # 搜索框定位 search_input = driver.find_element_by_id('kw') # element.send_keys(string)输入文本 # 所有可输入的标签都适用 search_input.send_keys('软件测试') # 搜索按钮定位 search_btn = driver.find_element_by_xpath('//input[@value="百度一下"]') # 点击 # element.click()点击 search_btn.click() time.sleep(3)5、填充表单_单选按钮import time from selenium import webdriver with webdriver.Chrome() as driver: driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_form_radio') # 切换iframe iframe = driver.find_element_by_id('iframeResult') driver.switch_to.frame(iframe) # 找到female单选框 female = driver.find_element_by_xpath('//input[@value="female"]') # 在元素上点击 female.click() # 选中 time.sleep(5)6、填充表单_下拉列表下拉框有两种处理方法:(1)直接定位到要选中的option选项,然后点击(2)通过selenium.webdriver.support.ui.Select类import time from selenium import webdriver from selenium.webdriver.support.ui import Select with webdriver.Chrome() as driver: driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_elements_select') # 切换iframe iframe = driver.find_element_by_id('iframeResult') driver.switch_to.frame(iframe) # 找到audi选项 # 1. 通过option直接操作 option = driver.find_element_by_xpath('//option[@value="audi"]') option.click() time.sleep(1) # 2. 通过select类 # 找到select select = Select(driver.find_element_by_xpath('//select[@name="cars"]')) # # # 选中索引为1的选项,索引从0开始 select.select_by_index(1) time.sleep(1) # # # 选中value等于audi的选项 select.select_by_value('audi') time.sleep(1) # # # 选中option的文本为Volvo的选项 select.select_by_visible_text('Volvo') time.sleep(3)7、切换窗口和标签页webdriver 不区分窗口和标签页。打开一个新的标签页或者窗口,selenium会使用窗口句柄来处理它。每个窗口都有一个唯一的标识符,该标识符在单个会话中保持持久性。(1)获取当前窗口句柄:driver.current_window_handle;(2)切换窗口或标签页:通过循环遍历的方式来切换;import time from selenium import webdriver with webdriver.Chrome() as driver: driver.get('https://www.baidu.com') # 找到搜索框 search_input = driver.find_element_by_id('kw') search_input.send_keys('图片') # 点击搜索按钮 driver.find_element_by_id('su').click() time.sleep(1) # 获取原窗口的handle original_window = driver.current_window_handle print('当前窗口句柄', original_window) print('窗口的title', driver.title) # 选取第一个结果并点击 driver.find_element_by_xpath('//div[@id="3001"]//a').click() # time.sleep(1) for handle in driver.window_handles: if handle != original_window: # 切换到新窗口 driver.switch_to.window(handle) break # 打印当前窗口句柄 print('新打开的搜索页面句柄', driver.current_window_handle) print('新打开的页面的title', driver.title) time.sleep(5)8、显式等待浏览器渲染页面的时候需要时间,如果没有渲染完成就对元素进行定位将会找不到到该元素;所以需要加延时进行等待,有三种等待方式:(1)time.sleep()前面已经反复使用了;等待时间固定,不稳定;等待时间多半不确定;(2)显式等待显式等待就是在元素操作前循环判断操作的条件是否满足,满足后再操作;selenium通过selenium.webdriver.support.ui.WebDriverWait类的对象来实现显式等待;webDriverWait类实例化时可以接收3个参数:driver: webdriver对象timeout:超时时间,最多等待多少秒poll_frequency: 检查频率,默认0.5秒until方法接受1个参数:conditions:条件在selenium.webdriver.support.expected_conditions 模块中;常见条件:presence_of_element_located:元素存在于dom中visibility_of_element_located:元素可见element_to_be_clickable:元素可点击element_to_be_selected:元素可选择实例化条件需要传入一个定位参数,是一个二元元组:(by, loc_expression)import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By import selenium.webdriver.support.expected_conditions as EC with webdriver.Chrome() as driver: driver.get('https://www.baidu.com') # 找到搜索框 search_input = driver.find_element_by_id('kw') search_input.send_keys('图片') # 点击搜索按钮 driver.find_element_by_id('su').click() # 获取原窗口的id original_window = driver.current_window_handle print('当前窗口句柄', original_window) print('窗口的title', driver.title) # 选取第一个结果并点击 # # WebDriverWait(driver, timeout=3).until( # EC.visibility_of_element_located((By.XPATH, '//div[@id="3001"]//a')) # ).click() s_time = time.time() btn = WebDriverWait(driver, timeout=3).until( EC.visibility_of_element_located((By.ID, '3001')) ) btn.click() e_time = time.time() print(e_time-s_time) # WebDriverWait(driver, timeout=3).until( # EC.visibility_of_element_located(('id', '3001')) # ).click() # 会等待id为3001的元素可见,timeout=3表示最多等待3秒钟,超时就抛出异常 # driver.find_element_by_xpath('//div[@id="3001"]//a').click() # time.sleep(1) for handle in driver.window_handles: if handle != original_window: # 切换到新窗口 driver.switch_to.window(handle) break # 打印当前窗口句柄 print('新打开的搜索页面句柄', driver.current_window_handle) print('新打开的页面的title', driver.title) time.sleep(5)9、隐式等待(3)隐式等待隐式等待本质上是设置了一个全局等待时间,WebDriver在试图查找任何元素时都会轮询一定时间,默认情况下隐式等待是禁用的。警告:不要混用隐式等待和显示等待,这样会导致不可预测的等待时间。例如:隐式等待设置10秒,显式等待设置15秒,可能导致在20秒后发生超时;隐式等待是告诉WebDriver如果在查找一个或多个不是立即可用的元素时轮询DOM一段时间。默认设置为0,表示禁用。一旦设置好,隐式等待就会被设置为会话的生命周期。import time from selenium import webdriver with webdriver.Chrome() as driver: # 设置隐式等待5秒 driver.implicitly_wait(5) driver.get('https://www.baidu.com') # 找到搜索框 search_input = driver.find_element_by_id('kw') search_input.send_keys('图片') # 点击搜索按钮 driver.find_element_by_id('su').click() # 获取原窗口的id original_window = driver.current_window_handle print('当前窗口句柄', original_window) print('窗口的title', driver.title) # 选取第一个结果并点击 driver.find_element_by_xpath('//div[@id="3001"]//a').click() for handle in driver.window_handles: if handle != original_window: # 切换到新窗口 driver.switch_to.window(handle) break # 打印当前窗口句柄 print('新打开的搜索页面句柄', driver.current_window_handle) print('新打开的页面的title', driver.title) time.sleep(5)10、警告框WebDriver提供了一个API,用于处理JavaScript提供的三种类型的原生弹窗消息(1)Alerts警告框import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC with webdriver.Chrome() as driver: driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_alert') driver.switch_to.frame('iframeResult') button = WebDriverWait(driver, timeout=3).until( EC.visibility_of_element_located(('xpath', '//button'))) # 有时候需要结合sleep来处理 # time.sleep(1) button.click() # time.sleep(3) # 等待alert弹出 alert = WebDriverWait(driver, timeout=3).until(EC.alert_is_present()) # time.sleep(1) # alert = driver.switch_to.alert # 获取弹出框文本 text = alert.text print(text) time.sleep(1) # # 确认 alert.accept() time.sleep(1)11、confirm确认框(2) confirm确认框与警告框不同,确认框还有取消按钮;import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC with webdriver.Chrome() as driver: driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_confirm') driver.switch_to.frame('iframeResult') button = WebDriverWait(driver, timeout=3).until( EC.visibility_of_element_located(('xpath', '//button'))) button.click() # # 等待confirm弹出 WebDriverWait(driver, timeout=3).until(EC.alert_is_present()) # # # 获取alert alert = driver.switch_to.alert # # # 获取弹出框文本 text = alert.text print(text) time.sleep(2) # # 取消 # 点击取消后 当前的alert对象就会被销毁 alert.dismiss() # alert.accept() 确认 time.sleep(2)12、prompt提示框(3)prompt提示框还可以输入文本;import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC with webdriver.Chrome() as driver: driver.get('https://www.w3school.com.cn/tiy/t.asp?f=js_prompt') driver.switch_to.frame('iframeResult') button = WebDriverWait(driver, timeout=3).until( EC.visibility_of_element_located(('xpath', '//button'))) # 避免js没有绑定出现意外问题,加一秒延时 time.sleep(1) button.click() # 等待alert弹出 WebDriverWait(driver, timeout=3).until(EC.alert_is_present()) # 获取alert alert = driver.switch_to.alert # 输入信息 alert.send_keys('testleaf') time.sleep(3) # 确认 alert.accept() # alert.dismiss() 取消 time.sleep(3)13、鼠标操作动作链鼠标是通过使用底层接口执行的,需要调用ActionChains对象来执行对应的方法。(1)clickAndHold:它将移动到该元素,然后在给定元素的中间单击(不释放);(2)contextClick:此方法首先将鼠标移动到元素的位置, 然后在给定元素执行上下文点击(右键单击);(3)doubleClick:它将移动到该元素, 并在给定元素的中间双击;(4)moveToElement:此方法将鼠标移到元素的中间. 执行此操作时, 该元素也会滚动到视图中;(5)moveByOffset:此方法将鼠标从其当前位置(或0,0)移动给定的偏移量. 如果坐标在视图窗口之外, 则鼠标最终将在浏览器窗口之外;(6)dragAndDrop:此方法首先在源元素上单击并按住,然后移动到目标元素的位置后释放鼠标;(7)release:此操作将释放按下的鼠标左键. 如果WebElement转移了, 它将释放给定WebElement上按下的鼠标左键;import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC with webdriver.Chrome() as driver: driver.get(r'file://D:\project\action.html') div = WebDriverWait(driver, timeout=3).until(EC.visibility_of_element_located(('xpath', '//div[@οnmοuseοver="mOver(this)"]'))) # 移动到指定元素 move_to_element webdriver.ActionChains(driver).move_to_element(div).perform() time.sleep(2) # 移开多大位置x,y move_by_offset webdriver.ActionChains(driver).move_by_offset(xoffset=500, yoffset=500).perform() time.sleep(2) # 点住不放 click_and_hold div = driver.find_element_by_xpath('//div[@οnmοusedοwn="mDown(this)"]') webdriver.ActionChains(driver).click_and_hold(div).perform() time.sleep(2) # 松开鼠标 release webdriver.ActionChains(driver).release(div).perform() time.sleep(2) # double_click 双击 button = driver.find_element_by_xpath('//button[@ondblclick]') webdriver.ActionChains(driver).double_click(button).perform() time.sleep(2) # drag 将div1拖拽到div2上 div1 = driver.find_element_by_id('draggable') div2 = driver.find_element_by_id('droppable') webdriver.ActionChains(driver).drag_and_drop(div1, div2).perform() time.sleep(3) # contextClick 点击鼠标右键 div = driver.find_element_by_xpath('//div[@οnmοusedοwn="whichButton(event)"]') webdriver.ActionChains(driver).context_click(div).perform() time.sleep(2)14、执行js代码_滚动1selenium执行js有几个方法,这里我们使用最常用的方法execute_script;import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC with webdriver.Chrome() as driver: driver.get('https://image.baidu.com') search_input = WebDriverWait(driver, 3).until(EC.visibility_of_element_located(('id', 'kw'))) search_input.send_keys('软件测试') WebDriverWait(driver, 3).until(EC.element_to_be_clickable(('xpath', '//input[@value="百度一下"]'))).click() time.sleep(3) # 滚动到(0px,100px)的位置 driver.execute_script("window.scrollTo(0,100)") time.sleep(1) driver.execute_script("window.scrollTo(0,200)") time.sleep(1) driver.execute_script("window.scrollTo(0,300)") time.sleep(3) # 移动到底部 driver.execute_script("window.scrollTo(0,document.body.scrollHeight)") time.sleep(3) # 移动到顶部 driver.execute_script("window.scrollTo(0,0)") time.sleep(3)15、执行js代码_滚动2selenium执行js有几个方法,这里我们使用最常用的方法execute_script;执行js时,还可以传递参数给js脚本;下面的案例:打开页面,并滚动到指定的元素可见为止;下面的代码 div 被传递给了arguments,通过切片的方式可以取出;import time from selenium import webdriver from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC with webdriver.Chrome() as driver: driver.get(r'file://D:\project\scroll.html') time.sleep(2) div = driver.find_element_by_xpath('//div') # 移动到元素的底端与当前窗口的底部对齐 driver.execute_script("arguments[0].scrollIntoView(false);", div) time.sleep(2) # 移动到元素的顶端与当前窗口的顶端对齐 driver.execute_script("arguments[0].scrollIntoView();", div) time.sleep(2)16、上传操作_input上传selenium只支持input元素的上传,直接使用send_keys将文件绝对地址写入元素即可;import time from selenium import webdriver with webdriver.Chrome() as driver: driver.get('https://www.baidu.com') span = driver.find_element_by_xpath('//span[@class="soutu-btn"]') span.click() time.sleep(1) input = driver.find_element_by_xpath('//input[@class="upload-pic"]') input.send_keys(r'D:\project\find.jpg') # 有可能还需要提交的操作,百度是不需要 time.sleep(10)17、上传操作_非input上传_pywinauto很多时候页面不是使用input来进行文件上传,这是就需要通过其他第三方包来操作系统界面;(1)pywinauto缺点: 只能在windwows上使用;优点:可以选择多个文件,路径中有中文也可以;import time from selenium import webdriver from pywinauto.keyboard import send_keys with webdriver.Chrome() as driver: driver.get('https://www.baidu.com') span = driver.find_element_by_xpath('//span[@class="soutu-btn"]') span.click() time.sleep(1) # select_span = driver.find_element_by_xpath('//span[text()="选择文件"]') select_span = driver.find_element_by_xpath('//div[@class="upload-wrap"]') # 点击打开选择文件窗口 select_span.click() time.sleep(3) # 选择文件 send_keys(r'D:\project\find.jpg') time.sleep(1) # # 选择确定 send_keys('{ENTER}') time.sleep(10)18、上传操作_非input上传_pyautogui很多时候页面不是使用input来进行文件上传,这里就需要通过其他第三方包来操作系统界面;(2)pyautogui缺点: 只能选择一个文件,文件路径有中文会出问题;优点:跨平台(windows,mac,linux);import time from selenium import webdriver import pyautogui with webdriver.Chrome() as driver: driver.get('https://www.baidu.com') span = driver.find_element_by_xpath('//span[@class="soutu-btn"]') span.click() time.sleep(1) # select_span = driver.find_element_by_xpath('//span[text()="选择文件"]') select_span = driver.find_element_by_xpath('//div[@class="upload-wrap"]') # 点击打开选择文件窗口 select_span.click() time.sleep(3) # 选择文件 pyautogui.write(r"D:\project\find.jpg") time.sleep(1) # 选择确定 pyautogui.press('enter', 2) time.sleep(10)
0
0
0
浏览量11
熊Sir

selenium学习使用操作大全(Python版)——判断元素是否允许被操作

判断元素是否允许被操作driver.find_element_by_name("XXX").is_enabled() # 是否可以编辑,或者按钮是否可以点击 driver.find_element_by_name("XXX").is_displayed() # 判断元素是否显示 element=driver.find_element_by_name("XXX").is_selected() # 判断元素是否选中状态
0
0
0
浏览量2026
熊Sir

selenium学习使用操作大全(Python版)——浏览器驱动下载

一、浏览器驱动下载Selenium需要浏览器驱动程序才能与所选浏览器交互。例如,Firefox需要安装geckodriver。确保它在PATH中。主流浏览器驱动下载地址如下:具体,可以查看:chromedriver、geckodriver、MicrosoftWebDriver、IEDriverServer和operadriver之间的恩怨纠葛ps:最新版chromedriver的下载地址:https://googlechromelabs.github.io/chrome-for-testing/#stable
0
0
0
浏览量2073
熊Sir

WireShark 捕获过滤器的超全使用教程——捕获过滤表达式

捕获过滤表达式(1)语法说明捕获过滤器:采用的是 BPF(Berkeley Packet Flter)语法BPF(官方说明文档):是一个用于过滤网络报文的框架,主要有两个功能根据外界输入的规则过滤报文将符合条件的报文由内核复制到用户空间捕获过滤表达式:一个 “表达式” 包含多个 “原语” ,“原语” 通常包含一个 id(标识,比如 IP、域名、端口,可以是数字或者是名称)或多个 “限定符” 组成,原语之间可以使用逻辑运算符组合。(2)限定符在给定表达式的组成部分中,一个src限定词和192.168.0.10组成了一个原语。这个源于本身就是表达式,可以用它只捕获那些目标IP地址时192.168.0.10的流量。你可以使用一下3中逻辑运算符,对原语进行组合,从而创建更高级的表达式。连接运算符 与 (&&)选择运算符 或 (||)否定运算符 非 (!)举例来说,下面的这个表达式只对源地址是192.168.0.10和源端口或目标端口是80的流量进行捕获。src 192.168.0.10 && port 80三种类型限定符,包括 type (类型)、dir (方向)、proto (协议) :type (类型)host, net, port 和 portrange默认 hostdir (方向)src, dst, src or dst, src and dst默认 src or dstproto (协议)ether, ip, ip6, arp, tcp 和 udp默认和 type 一致的所有协议(3)运算符<expr> relop <expr>relop :>,<,>=,<=,=,!=expr :一个算术表达式,由整型常量、二进制运算符[+、-、*、/、%、&、|、^、<<、>>]、长度运算符和特定数据包数据引用运算符组成。proto [ expr : size ]proto:ether, wlan, ppp, ip, arp, rarp, tcp, udp, icmp, ip6,指明该引用操作所对应的协议。expr:给出指定协议层的字节偏移量。size:可选,表示感兴趣字段中的字节数;它可以是 1、2 或 4 ,默认值是 1 。(4)特殊原语关键字特殊原语关键字:gateway, broadcast, less, greater 和算术表达式等。[x] , x 为可选x|y , 选 x 或 y<x>,x 为必选xyz , xyz 为关键字,必需and(&&)、or(||)、not(!), 代表与、或、非(5)语法解析<Protocol> <Direction> <Host> <Value> <Logical Operation> <other expression>Protocol (协议) :该选项用来指定协议可使用的值有:ether、fddi、 wlan、 ip、arprarp、decnet、 lat、 sca、 moproc、 mopdl、 tcp 、udp如果没指明协议类型,则默认为捕捉所有支持的协议Direction (方向) :该选项用来指定来源或目的地可使用的值有:src、dst、 sre and dst 、src or dst如果没指明方向,则默认使用  src or dst  作为关键字Host(s):指定主机地址可能使用的值有:net、port、 host 、portrange如果没有指定,默认使用 host 关键字src 10.1.1.1 与 src host 10.1.1.1 等价Logical Operations (逻辑运算):该选项用来指定逻辑运算符可能使用的值有:not 、and 、 or否(“not”) 具有最高的优先级或(“or”) 和 与(“and”) 具有相同的优先级运算时从左至右进行Other expression (其他表达式) :使用其他表达式捕获过滤器 (6)过滤类型①  基于类型过滤基于类型过滤:Wireshark 可以基于类型进行捕获过滤。其中可能使用的类型有:主机 host,网段net,端口port,端口范围 portrange 和 特殊类型⒈主机 host语法格式: host host解析:第一个 host 表示过滤器类型为 host:第二个 host 表示主机地址,可以是 ipv4 或 Ipv6 地址。示例:捕获主机192.168.1.10 的数据包语法:host 192.168.1.10⒉网段 netnet 用来指定捕获那个网段的数据包,其中网络类型的过滤器有三种形式。分别是:net netnet masknet CIDRnet netnet 192.168.1.0 //对应掩码 255.255.255.255net 192.168.1 //对应掩码 255.255.255.0net 192.168 //对应掩码 255.255.0.0net 192 //对应掩码255.0.0.0net masknet 192.168.1.0 mask 255.255.255.0net CIDRnet 192.168.1.0/24⒊端口 port 语法格式: port port示例:port 80⒋端口范围语法格式:portrange port1-port2示例:portrange 1-100 ⒌特殊类型gateway host ② 基于传输方向的过滤⒈源 srcsrc host host //仅捕获地址为指定主机的数据包src net net //仅捕获源地址为指定网段的数据包src port port //仅捕获源端口为指定端口的数据包src portrange port1-port2 //仅捕获端口范围为指定端口范围的数据包⒉目标 dst dst host host //仅捕获地址为指定主机的数据包dst net net //仅捕获源地址为指定网段的数据包dst port port //仅捕获源端口为指定端口的数据包dst portrange port1-port2 //仅捕获端口范围为指定端口范围的数据包 ⒊源或者目标src or dst hostsrc or dst netsrc or dst portsrc or dst portrange port1-port2 ⒋源和目标src and dst hostsrc and dst netsrc and dst portsrc and dst portrange port1-port2 ⒌特殊方向除了上述还有两种特殊方向捕获过滤器,分别是:广播:broadcast多播:multicastether broadcast //捕获以太网广播流量ip broadcast //捕获ip广播流量ether multicast //捕获哦以太网多播流量广播和多播的区别https://link.zhihu.com/?target=https%3A//zhidao.baidu.com/question/48206411.html③ 基于协议过滤 支持的协议过滤器协议含义这些可以搭配前面所讲的过滤方式达到更加巧妙的过滤方式例子:过滤源主机为192.168.1.100并且为tcp协议端口80的数据⒈ether格式ether proto <proto> 或 ip|ip6|arp⒉ip|ip6格式[ip|ip6] proto <proto> [ip|ip6] protochain <proto> 或 tcp|udp|icmp|icmp6示例proto <proto>、ip proto <proto>、ip6 proto <proto> ...可以是  数字(包括1、6、17等),也可以是  名字(包括 icmp, icmp6, igmp, igrp, pim, ah, esp, vrrp, udp, 或 tcp),名字需加  转义符 \,譬如 ip proto \tcp;wireshark 下 protochain 与 proto 使用基本无区别;在 tcpdump 下区别在于输出显示,protochain 会把数据包中协议头链中所有协议头内容打印显示出来。⒊mpls格式mpls [label_num]示例mpls、mpls [label_num]、 mpls [label_num1] and mpls [label_num2]、 mpls and mpls [label_num] ...mpls 标签号;mpls 表达式可以使用不止一次,以过滤 mpls 层次结构,每次使用该表达式都会使过滤器偏移量增加 4 ;内部标签 num2,外部标签 num1;内部标签 num 封装在任意外部标签中。④ 基于数据过滤 ⒈长度过滤可以使用 less ,greater 关键字:less 12 也可写成 len <=12greater 12 也可写成 len>=12⒉基于内容过滤语法格式: proto[expr:size] relop express参数解析:proto:支持的协议,有ether,fddi,tr,wlan,ppp,slip,link,ip,arp,rarp,tcp,udp,icmp,ip6或radioexpr :指定协议的偏移地址size:指定数据长度其中,单位bitrelop:指定使用的运算符,关系运算符有,>,<,>=,<=.=,!=,二进制运算符有,+,-,*,/,%,&,|,^,<<,>>例如:捕获所有ipv4地址包ip[0] & 0xf !=5⑤ 使用多个捕获过滤器 通过结合逻辑运算符可以同时使用多个捕获过滤器。有: not (!) ,and(&&),or(||) ,例如:捕获主机192.168.1.100,而且tcp端口为80的数据包host 192.168.1.100 and tcp port 80注意: not(!) 具有最高优先级,and(&&)和 or(||)优先级相等。⑥ 使用预置表达式 预先将常用的表达式设置好,方便直接使用 下拉框选中点击:管理捕获过滤器(7)常见的捕获过滤器表达式① 只捕获某主机的HTTP流量host 192.168.5.231 and port 80 and http #只捕获主机192.168.5.231 的http流量。注意如果你的HTTP端口为8080,把80 改为8080。port 80 and http #捕获所有经过该接口的http流量。注意如果你的HTTP端口为8080,把80 改为8080。host 192.168.5.231 and not port 80 # 捕获主机192.168.5.231除 http 之外的其他所有流量,注意如果你的HTTP端口为8080,把80 改为8080。not port 80 # 捕获除 http 之外的其他所有流量,注意如果你的HTTP端口为8080,把80 改为8080。not port 80 and !http # 捕获除 http 之外的其他所有流量,注意如果你的HTTP端口为8080,把80 改为8080。② 只捕获某主机的所有流量host 192.168.5.231 #捕获源目主机均为192.168.5.231dst 192.168.5.231 #捕获目的主机均为192.168.5.231src 192.168.5.231 #捕获来源主机均为192.168.5.231net 192.168.5.0/24 #捕获网段为d192.168.5的所有主机的所有流量③ 只捕获某主机的DNS流量host 192.168.5.231 and port 53 # 只捕获主机192.168.5.231 的dns流量。src 192.168.5.231 and port 53 #只捕获主机192.168.5.231 对外的dns 的流量。dst 192.168.5.231 and port 53 #只捕获dns服务器相应主机192.168.5.231的dns流量。port 53 #捕获接口中的所有主机的dns流量④ 只(不)捕获APR流量host 192.168.5.231 and arp#只捕获主机192.168.5.231 的arp流量。host 192.168.5.231 and !arp #只捕获主机192.168.5.231 除arp外的所有流量。arp #捕获接口中的所有arp请求!arp #捕获接口中所有非arpq请求。⑤ 只捕获特定端口的流量tcp portrange 8000-9000 an port 80 #捕获端口8000-9000之间和80端口的流量port 5060 #捕获sip流量,因为sip的默认端口是5060。举一反三:port 22 #捕获ssh流量⑥ 捕获电子邮件的流量host 192.168.5.231 and port 25 # 捕获主机192.168.5.231 的POP3协议的流量。port 25 and portrange 110-143 #因为电子邮件的协议:SMTP、POP3、IMAP4,所以捕获端口的流量。⑦ 捕获 vlan 的流量vlan #捕获所有vlan 的流量vlan and (host 192.168.5.0 and port 80) #捕获vlan 中主机192.168.5.0 ,前提是有vlan,在wifi中不一定可以捕获到相应的流量,局域网(公司,学校里面的网络应该有vlan)⑧ 捕获 PPPoE 流量pppoes #捕获所有的pppoes流量pppoes and (host 192.168.5.231 and port 80) #捕获主机如果要捕获某种协议的流量,可以尝试捕获该端口的流量,请查看端口常识:端口常识https://svn.nmap.org/nmap/nmap-services(8)过滤层次⒈ehost格式ether [src|dst] host <ehost>示例ether host <ehost>、 ether src <ehost>、ether src host <ehost> ether dst <ehost>、ether dst host <ehost>mac 地址支持多种写法:"xx:xx:xx:xx:xx:xx", "xx.xx.xx.xx.xx.xx", "xx-xx-xx-xx-xx-xx", "xxxx.xxxx.xxxx", "xxxxxxxxxxxx"⒉broadcast|multicast格式[ether] broadcast|multicast示例broadcast、multicast、 ether broadcast、ether multicastIPv4 多播流量,其目的 MAC 地址必以  01:00:5e 开头;IPv6 多播流量,其目的 MAC 地址必以  33:33 开头。⒊vlan格式vlan <vlan>示例vlan <vlan> vlan <vlan 1> and vlan <vlan 2> vlan and vlan <vlan 1>vlan 编号;vlan 表达式可以使用不止一次,以过滤 vlan 层次结构,每次使用该表达式都会使过滤器偏移量增加 4 ;vlan2 封装在 vlan1 中;vlan1 封装在任意 vlan 中。⒋len格式less|greater <length>示例less <length>、greater <length>frame 长度;等同于 len <= length、len >= length 。② 三层过滤⒈host格式[ip|ip6|arp|rarp] [src|dst] host <host>示例host <host>、src host <host>、dst host <host>、 ip host <host>、ip src host <host>、 arp host <host>、arp dst host <host>⒉net格式[src|dst] net <net> [{mask <mask>}|{/<len>}]示例net <net>、src net <net>、dst net <net>、 net <net> mask <mask>、src net <net> mask <mask>、 net <net>/<len>、net <net> /<len> ...⒊broadcast|multicast格式 & 示例ip broadcast|multicast ip6 multicast⒋gateway格式gateway <host> 匹配以太网地址是 host ,但 IP 地址不是 host 的数据包 等同于 ether host <ehost> and not host <host>示例gateway testhost 必须为  名字 ;必须同时在  主机名-IP地址 (host name file, DNS 等) 和  主机名-以太网地址( /etc/ethers 等)文件中找到相对应的解析;Tcpdump 支持,但很少用( wireshark 不支持)。③ 四层过滤⒈port格式[tcp|udp] [src|dst] port|portrange <port>示例port <port>、src port <port>、dst port <port>、 portrange <port1-port2>、src portrange <port1-port2>、dst portrange <port1-port2>、 tcp port <port>、tcp dst port <port>、 tcp portrange <port1-port2>、tcp dst portrange <port1-port2> ...(9)复合型过滤① 与、或、非格式and、or、not 或 &&、||、!示例tcp port <port> and host <host>、 ip && host <>、 tcp port <port> or udp port <port>、 host <host> || host <host>、 not arp and host <host>、 ! tcp and port <port> ...(10)特殊过滤① 语法<expr> relop <expr>relop :>,<,>=,<=,=,!=expr :一个算术表达式,由整型常量、二进制运算符[+、-、*、/、%、&、|、^、<<、>>]、长度运算符和特定数据包数据引用运算符组成。&(and) 两者都为 1 则为 1 ,否则为 0 ;|(or) 两者都为 0 为 0 ,否则为 1 。proto [ expr : size ]proto:ether, wlan, ppp, ip, arp, rarp, tcp, udp, icmp, ip6,指明该引用操作所对应的协议。expr:给出指定协议层的字节偏移量。size:可选,表示感兴趣字段中的字节数;它可以是 1、2 或 4 ,默认值是 1 。长度运算符 (关键字 len 表示) 给出数据包的长度。② etherether[0]Destination 目的 mac(字节偏移量 0,长度 6 字节)示例ether[0] & 1 != 0 所有组播广播流量,第一个字节最低位为 1,反之 = 0 ,所有单播流量 ether[4:2] = 0x12ab 过滤目的 mac 后两位字节为 12ab 的数据包字节偏移量 0,意味着 size 1、2 或 4,选择范围均为目的 mac(6字节)内。ether[6]Source 源 mac(字节偏移量 6 ,长度 6 字节)示例ether[10:2] = 0x34cd 过滤源 mac 后两位字节为 34cd 的数据包ether[12]Type(字节偏移量 12,长度 2 字节)示例ether[12:2] = 0x0800 IPv4 数据包 ether[12:2] = 0x0806 ARP 数据包等同于  ip|arp③ lenframe长度示例len <= 60 长度小于等于 60 的 frame len >= 1500 长度大于等于 1500 的 frame等同于  less|greater④ arparp[0]Hardware type(字节偏移量 0 ,长度 2 字节)示例arp[0:2] = 1 Ethernetarp[2]Protocol type(字节偏移量 2 ,长度 2 字节)示例arp[2:2] = 0x0800 IPv4arp[4]Hardware address length(字节偏移量 4 ,长度 1 字节)示例arp[4] = 6 硬件地址长度 6arp[5]Protocol address length(字节偏移量 5 ,长度 1 字节)示例arp[5] = 4 协议地址长度 4arp[6]Opcode(字节偏移量 6 ,长度 2 字节)示例arp[6:2] = 1 request arp[6:2] = 2 replyarp[8]Source hardware address(字节偏移量 8 ,长度 n bytes,n 值为 Hardware address length)示例arp[12:2] = 0xb192 源 mac 地址后两位字节为 b192 的数据包可变长度n=6,则为 6 bytes(48 bit),即源 mac 地址arp[8+n]Source protocol address(字节偏移量 8+n,长度 m bytes,m 值为 Protocol address length)示例arp[14:4] = 0x0a000001 源IP为 10.0.0.1 的 ARP 数据包可变长度m=4,则为 4 bytes(32 bit),即源 IP 地址arp[8+n+m]Destination hardware address(字节偏移量 8+n+m,长度 n bytes,n 值为 Hardware address length)示例arp[22:2] = 0xb192 目的 mac 地址后两位字节为 b192 的数据包可变长度n=6,则为 6 bytes(48 bit),即目的 mac 地址arp request 中目的 MAC 地址为全 0arp[8+2n+m]Destination protocol address(字节偏移量 8+2n+m,长度 m bytes,m 值为 Protocol address length)示例arp[24:4] = 0xac100001 目的IP为 172.16.0.1 的 ARP 数据包可变长度m=4,则为 4 bytes(32 bit),即目的 IP 地址⑤ ipip[0]version(4bit)+ Header Length(4bit)(字节偏移量 0 ,长度 1 字节)示例ip[0] & 0x40 = 0x40 ip[0] & 64 = 64 ip[0] & 0xf0 = 64 IPv4 数据包 ip[0] & 0xf = 5 ip[0] & 5 = 5 IPv4 数据包首部长度 20 字节,即不含有可选字段最小值为 5,最大值为 15 number * 32-bit ip[0] & 0xf != 5 IPv4 数据包首部中含有可选字段ip[1]Differentiated Services Field:Differentiated Services Codepoint(6bit)+ Explicit Congestion Notification(2bit)(字节偏移量 1 ,长度 1 字节)ip[2]Total Length(字节偏移量 2 ,长度 2 字节)示例ip[2:2] = 60 ip[2:2] >=1000 IP 数据包总长度ip[4]Identification(字节偏移量 4 ,长度 2 字节)示例ip[4:2] = 0x0ip[6]Flags(3bit) + Fragment offset(13bit)(字节偏移量 6 ,长度 2 字节)示例ip[6] & 0x4f = 0x40 ip[6:2] & 0x4fff = 0x4000 Don't fragment 位设置为 1 的 IPv4 数据包 ip[6:2] & 0x3fff = 0 没被分片的 IPv4 数据包 ip[6:2] & 0x3fff = 0x2000 分片编号为 0 的被分片的 IPv4 数据包 ip[6:2] & 0x1fff = 0 没被分片的 IPv4 的数据包或者分片编号为 0 的被分片的 IPv4 数据包 ip[6] & 0x60 = 0 and ip[6:2] & 0x1fff != 0 最后一个分片的 IPv4 数据包ip[8]TTL(Time to live,8bit)(字节偏移量 8 ,长度 1 字节)示例ip[8] = 0x80 TTL 128ip[9]Protocol(8bit)(字节偏移量 9 ,长度 1 字节)示例ip[9] = 6 TCP ip[9] = 17 ip[9] = 0x11 UDPip[10]Header checksum(16bit)(字节偏移量 10 ,长度 2 字节)示例ip[10:2] = 0x0000首部检验和字段是根据 IP 首部计算的检验和码,它不对首部后面的数据进行计算;首部中每 16 bit 进行二进制反码求和。ip[12]Source 源IP地址(32bit)(字节偏移量 12 ,长度 4 字节)示例ip[12:4] = 0x0a000001 源 IP 为 10.0.0.1 的 IPv4 数据包ip[16]Destination 目的IP地址(32bit)(字节偏移量 12 ,长度 4 字节)示例ip[16:4] = 0xac100001 目的 IP 为 172.16.0.1 的 IPv4 数据包 ip[16] >= 224 组播广播数据包ip[20]Options,可变长度Padding,可变长度0-40 字节⑥ icmpicmp[0]Type(8bit)(字节偏移量 0 ,长度 1 字节)示例icmp[0] = 8 Echo(ping)request icmp[0] = 0 Echo(ping)replyicmp[1]Code(8bit)(字节偏移量 1 ,长度 1 字节)示例icmp[0] = 0icmp[2]Checksum(16bit)(字节偏移量 2 ,长度 2 字节)示例icmp[2:2] = 0x4cf4ICMP 校验和覆盖整个报文( ICMP 报头 + ICMP 数据)icmp[4]Identifier(BE)(字节偏移量 4 ,长度 2 字节) Identifier(LE)(字节偏移量 4 ,长度 2 字节)icmp[6]Sequence number(BE)(字节偏移量 6,长度 2 字节) Sequence number(LE)(字节偏移量 6,长度 2 字节)icmp[8]Data(n bytes)Windows 默认 32 字节,填充 16 进制数据为 61626364......( ASCII 码与 16 进制转换,61 为 a,62 为 b 等等)⑦ icmptype (icmp 类型字段)icmp[icmptype] == <identifier>示例icmp[icmptype] == 0 icmp echo-reply 数据包 icmp[icmptype] == 8 icmp echo-request 数据包 icmp[icmptype] == icmp-echoreply icmp echo-reply 数据包 icmp[icmptype] == icmp-echo icmp echo-request 数据包ICMP 类型字段值:icmp-echoreply, icmp-unreach, icmp-sourcequench, icmp-redirect, icmp-echo, icmp-routeradvert, icmp-routersolicit, icmp-timxceed, icmp-paramprob, icmp-tstamp,icmp-tstampreply, icmp-ireq, icmp-ireqreply, icmp-maskreq, icmp-maskreply。⑧ icmpcode (icmp 代码字段)icmp[icmpcode] == <identifier>示例icmp[icmpcode] = 0⑨ icmp6type (icmpv6 类型字段)⑩ icmp6code (icmpv6 代码字段)⑪ tcptcp[0]Source Port(16bit)(字节偏移量 0 ,长度 2 字节)示例tcp[0:2] = 0xc871等同于 tcp dst porttcp[4]Sequence number(32bit)(字节偏移量 4 ,长度 4 字节)示例tcp[4:4] = 0x88cf222a此段中第一个数据字节的序列号tcp[8]Acknowledgment number(32bit)(字节偏移量 8 ,长度 4 字节)示例tcp[8:4] = 0x424ade50一旦连接建立,则总是发送。tcp[12]Data Offset(4bit)(字节偏移量 12 ,长度 4 bit),即 Header Length示例tcp[12] & 0xf0 = 80 TCP 头部长度 20 字节number * 32-bittcp[13]Reserved(3bit),必须为 0;ECN(Explicit Congestion Notification,3bit),包括 Nonce、Congestion Window Reduced(CWR)、ECN-Echo 各 1bit;Control Bits(6bit),包括 Urgent、Acknowledgment、Push、Reset、Syn、Fin 各 1bit。示例tcp[13] & 32 != 0、tcp[13] & 32 = 32 URG tcp[13] & 16 != 0、tcp[13] & 16 = 16 ACK tcp[13] & 8 != 0、tcp[13] & 8 = 8 PSH tcp[13] & 4 != 0、tcp[13] & 4 = 4 RST tcp[13] & 2 != 0、tcp[13] & 2 = 2 SYN tcp[13] & 1 != 0、tcp[13] & 1 = 1 FIN匹配的标志位有值设置(1),其他标志位不确定。譬如 tcp[13] & 2 != 0 抓取的有 SYN ,也有 SYN+ACKtcp[13] = 32 URG tcp[13] = 16 ACK tcp[13] = 8 PSH tcp[13] = 4 RST tcp[13] = 2 SYN tcp[13] = 1 FIN匹配的标志位有值设置(1),其他标志位没有设置。譬如 tcp[13] = 2 只匹配 SYNtcp[13] & 17 = 17 FIN+ACK 同时置 1,其他不确定 tcp[13] & 17 = 16 FIN 置 0,ACK 置 1,其他不确定 tcp[13] & 1|16 = 17 FIN 置 1,其他不确定,一般实际抓包 ACK 也置 1 tcp[13] & 16|1 = 17 ACK 置 1,其他不确定 tcp[13] & (1|16) = 17 FIN+ACK 同时置 1,其他不确定 tcp[13] & (16|1) = 17 FIN+ACK 同时置 1,其他不确定 tcp[13] & (1|16) = 1|16 FIN+ACK 同时置 1,其他不确定 tcp[13] & (1|16) = 16 FIN 置 0,ACK 置 1,其他不确定 tcp[13] = 17 FIN+ACK 同时置 1,其他无设置 tcp[13] = 1|16 FIN+ACK 同时置 1,其他无设置&(and) 两者都为 1 则为 1,否则为 0 |(or) 两者都为 0 为 0 ,否则为 1tcp[14]Window size value(16bit)(字节偏移量 14 ,长度 2 字节)示例tcp[14:2] = 0x0200tcp[16]Checksum(16bit)(字节偏移量 16 ,长度 2 字节)示例tcp[16:2] = 0x2020TCP伪首部伪首部共有 12 字节,包含 IP 首部的一些字段,有如下信息:32 位源 IP 地址、32 位目的 IP 地址、8 位保留字节(置 0 )、8 位 IP 协议号( TCP 是 6 )、16 位报文总长度(首部+数据)。伪首部是为了增加校验和的检错能力:通过伪首部的目的IP地址来检查 TCP 报文是否收错了、通过伪首部的 IP 协议号来检查传输层协议是否选对了。TCP 首部校验和计算三部分:TCP 首部+ TCP 数据+ TCP 伪首部;如果总长度为奇数个字节,则在最后增添一个位都为 0 的字节;TCP 的检验和是必需的。tcp[18]Urgent Pointer(16bit)(字节偏移量 18 ,长度 2 字节)示例tcp[18:2] = 0tcp[20]Options,0 到 40 字节⑫ data可变长度⑬ tcpflags(tcp 标记字段)TCP 标记字段值:tcp-fin, tcp-syn, tcp-rst, tcp-push, tcp-ack, tcp-urg示例tcp[tcpflags] & tcp-urg != 0、tcp[tcpflags] & tcp-urg = tcp-urg tcp[tcpflags] & tcp-ack != 0、tcp[tcpflags] & tcp-ack = tcp-ack tcp[tcpflags] & tcp-push != 0、tcp[tcpflags] & tcp-push = tcp-push tcp[tcpflags] & tcp-rst != 0、tcp[tcpflags] & tcp-rst = tcp-rst tcp[tcpflags] & tcp-syn != 0、tcp[tcpflags] & tcp-syn = tcp-syn tcp[tcpflags] & tcp-fin != 0、tcp[tcpflags] & tcp-fin = tcp-fin tcp[tcpflags] = tcp-urg tcp[tcpflags] = tcp-ack tcp[tcpflags] = tcp-push tcp[tcpflags] = tcp-rst tcp[tcpflags] = tcp-syn tcp[tcpflags] = tcp-fin tcp[tcpflags] & (tcp-rst|tcp-ack) = (tcp-rst|tcp-ack) tcp[tcpflags] & (tcp-syn|tcp-ack) = (tcp-syn|tcp-ack)⑭ udpudp[0]Source Port(16bit)(字节偏移量 0 ,长度 2 字节)示例udp[0:2] = 0x104c等同于 udp src portudp[2]Destination Port(16bit)(字节偏移量 2 ,长度 2 字节)示例udp[2:2] = 0x6722等同于 udp dst portudp[4]Length(16bit)(字节偏移量 4 ,长度 2 字节)示例udp[4:2] = 0x00ccudp[6]Checksum(16bit)(字节偏移量 6 ,长度 2 字节)示例udp[6:2] = 0x459eUDP伪首部伪首部共有 12 字节,包含IP首部的一些字段,有如下信息:32 位源 IP 地址、32 位目的 IP 地址、8 位保留字节(置 0 )、8 位 IP 协议号( UDP 是 17 )、16 位报文总长度(首部+数据)。伪首部是为了增加校验和的检错能力:通过伪首部的目的IP地址来检查 UDP 报文是否收错了、通过伪首部的 IP 协议号来检查传输层协议是否选对了。UDP 首部校验和计算三部分:UDP 首部+ UDP 数据+ UDP 伪首部;如果总长度为奇数个字节,则在最后增添一个位都为 0 的字节;UDP 的检验和是可选的。udp[8]Data,可变长度
0
0
0
浏览量2078
熊Sir

WireShark 捕获过滤器的超全使用教程——应用场景

应用场景
0
0
0
浏览量2250
熊Sir

selenium学习使用操作大全(Python版)——selenium调整窗口大小

selenium调整窗口大小selenium调整窗口到指定大小:driver.set_window_size(900,1000)浏览器最大化:driver.maximize_window()
0
0
0
浏览量2024
熊Sir

selenium学习使用操作大全(Python版)——网页解析(HTML、xpath)

网页解析(HTML、xpath)1.HTMLHTML【Hyper Text Markup Language】:超文本标记语言,不是编程语言,用来描述网页的。也称为:网页的源码、html源码、html文档、document。具体,可以查看:网页的源码,html源码,html文档,documentHTML常用标签HTML示例:<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="UTF-8"> <title>Title</title> <style> #table { border: 1px solid } .th { font-size: 20px } </style> </head> <body> <div>我是一个div标签</div> <h1>我是一个大<span style="color:red">标签</span></h1> <p></p> <a href="https://blog.csdn.net/testleaf">testleaf</a> <table id="table"> <thead> <tr> <th class="th aaa">字段1</th> <th class="th">字段2</th> <th class="th">字段3</th> </tr> </thead> <tbody> <tr> <td>1</td> <td>2</td> <td>3</td> </tr> </tbody> </table> <form action=""> <p>用户名: <input type="text"></p> <p>密码:<input type="password"></p> <p><input type="submit"></p> </form> </body> </html>2.xpathxpath:一个解析html/xml的语言。语法选取节点nodename 选取此节点的所有子节点/ 从根节点选取// 从匹配选择的当前节点选择文档中的节点,不考虑它们的位置. 选取当前节点… 表示选取当前节点的父节点,如://div[@class="active"]/..@ 选取属性案例//div 获取文档中的所有的div谓语 用来查找特定的节点,或者包含指定值的节点谓语被包裹在中括号中//div[@class="active"]//div[@class="active" and @id="kw"]//div[@class="active" or @id="kw"]//div[@class="active"]/span[last()]轴 用来查找相对于当前节点的节点使用语法 轴名称::节点名称[谓语]ancestor 选取当前节点的所有父辈节点parent 选取当前节点的父节点如://div[@class="active"]/child::book…详见 https://www.w3school.com.cn/xpath/xpath_axes.asp函数text() 元素的text内容//li[text()="强烈推荐"]contains(@属性名/text(), value)包含的内容//li[contains(@class, "ls")]在浏览器中进行验证:$x('//div')
0
0
0
浏览量2042
熊Sir

selenium学习使用操作大全(Python版)——获取某个元素的html

获取某个元素的htmldriver.find_element_by_id('XXX').get_attribute('innerHTML')
0
0
0
浏览量2022
熊Sir

Selenium 简介

Selenium 简介Selenium 经历了三个大版本,Selenium 1.0、Selenium 2.0 和 Selenium 3.0。Selenium 不是由单独一个工具构成的,而是由一些插件和类库组成的,这些插件和类库有其各自的特点和应用场景。Selenium 1.0 家族关系如下图所示。1.1 Selenium 1.0(1)Selenium IDE。Selenium IDE 是嵌入在 Firefox 浏览器中的一个插件,它提供了比较完备的自动化功能,如脚本录制/回放、定时任务等;还可以将录制的脚本导成不同编程语言的 Selenium 测试脚本,这在很大程度上可以帮助新手编写测试用例。但旧版的 Selenium IDE 不支持 Firefox 新版本支持的 API,因此 Selenium 团队重新开发了新版的 Selenium IDE,可以同时支持 Chrome、Firefox 以及其他浏览器。项目地址:https://github.com/SeleniumHQ/selenium-ide。(2)Selenium Grid。Selenium Grid 是一个自动化测试辅助工具。利用 Grid 可以很方便地实现在多台机器上或异构环境中运行测试用例。(3)Selenium RC(Remote Control)。Selenium RC是 Selenium 家族的核心部分,支持多种不同语言编写的自动化测试脚本。把 Selenium RC 的服务器作为代理服务器去访问应用,即可达到测试的目的。Selenium RC 分为 Client Libraries 和 Selenium Server 两部分。Client Libraries 主要用于编写测试脚本,负责控制 Selenium Server 的库。Selenium Server 负责控制浏览器行为。 Selenium Server 主要分为三部分:Selenium Core、Launcher 和 Http Proxy。Selenium Core就是一堆 JavaScript 函数的集合。通过这些 JavaScript 函数,我们可以用程序对浏览器进行操作。Launcher 用于启动浏览器,把 Selenium Core 加载到浏览器页面当中,同时,把浏览的代理设置为 Http Proxy。1.2 Selenium 2.0Selenium 2.0 把 WebDriver 加到了 Selenium1.0 这个家族中,简单用公式表示如下:Selenium 2.0 = Selenium 1.0 + WebDriver需要注意的是,在 Selenium 2.0 中主推的是 WebDriver,可以将其看作 Selenium RC 的替代品。为了保持向下的兼容性,Selenium 2.0 并没有彻底抛弃 Selenium RC。Selenium RC 与 WebDriver 的工作方式有着本质的区别。(1)Selenium RC的工作原理:需要Selenium RC启动一个Server,将操作Web元素的API调用转化为一段段Javascript,在Selenium内核启动浏览器之后注入这段Javascript。这种Javascript注入技术的缺点是速度不理想,而且稳定性大大依赖于Selenium内核对API翻译成的Javascript质量高低。 (2)WebDriver的工作原理:当Selenium2.x 提出了WebDriver的概念之后,它提供了完全另外的一种方式与浏览器交互。那就是利用浏览器原生的API,封装成一套更加面向对象的Selenium WebDriver API,直接操作浏览器页面里的元素,甚至操作浏览器本身(截屏,窗口大小,启动,关闭,安装插件,配置证书之类的)。由于使用的是浏览器原生的API,速度大大提高,并且避免了 JavaScript 安全模型导致的限制。当然带来了一些副作用,就是不同的浏览器厂商,对Web元素的操作和呈现多少会有一些差异,这就直接导致了Selenium WebDriver要分浏览器厂商不同,而提供不同的实现。例如Firefox就有专门的FirefoxDriver,Chrome就有专门的ChromeDriver等等。(甚至包括了AndroidDriver和iOS WebDriver)1.3 Selenium 3.0Selenium 3.0 做了以下更新:(1)去掉了 Selenium RC,简单用公式表示如下:Selenium 3.0 = Selenium 2.0 −Selenium RC(2)Selenium 3.0 只支持 Java 8 以上版本。(3)Selenium 3.0 中的 Firefox 浏览器驱动独立了。Selenium 2.0 测试库默认是集成Firefox 浏览器驱动的,在 Selenium 3.0 中,Firefox 浏览器和 Chrome 浏览器一样,在使用前需要下载和设置浏览器驱动。(4)mac OS 操作系统集成了 Safari 的浏览器驱动,该驱动默认在/usr/bin/safaridriver 目录下。(5)只支持 IE 9.0 以上版本。1.4 各浏览器驱动下载地址GeckoDriver(Firefox):https://github.com/mozilla/geckodriver/releasesChromeDriver(Chrome):https://sites.google.com/a/chromium.org/chromedriver/homeIEDriverServer(IE):http://selenium-release.storage.googleapis.com/index.htmlOperaDriver(Opera):https://github.com/operasoftware/operachromiumdriver/releasesMicrosoftWebDriver(Edge):https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver
0
0
0
浏览量2037
熊Sir

WireShark 捕获过滤器的超全使用教程——数据包抓取实战

(1)抓取源 ip优酷番剧主页:抓取源 ip 为 14.17.92.74 的数据包src host 14.17.92.74(2)抓取本机 Mac 地址抓取关于本机 Mac 地址的数据包:因为我的台式机连的是 WiFi 所以选中「WLAN」,如果是网线连接,则直接选择 「本地连接」媒体未断开连接的接口ipconfig /allether src host 8C-...-8C-89(3)抓取指定端口的源 ip优酷番剧主页:抓取源 ip 为 183.158.198.19 的数据包,并指定端口为 4483(4)主机名和地址过滤器你所创建的大多数过滤器都会关注与一个或一些特定的网络设备。根据这个情况,可以根据设备的MAC地址、IPv4地址、IPv6地址或者DNS主机名配置过滤规则。举例来说,假设你对一个正在和你网络中某个服务器进行交互的主机所产生的流量感兴趣,你在这台服务器上可以创建一个使用host限定词的过滤器,来捕获所有和那台主机IPv4地址相关的流量。host 172.16.16.149去过你在使用一个IPv6网络,你可能需要使用基于IPv6地址的host限定词进行过滤,如下所示。host 2001:0:9d38:6ab8:3845:3f91:9aca:947a你同样可以使用基于一台设备的主机名host限定词进行过滤,就像一下这样。host testserver2或者,如果你考虑到一台主机的IP地址可能会变化,你可以通过加入ether协议限定词,对它的MAC地址进行过滤。ether host 00-1a-a0-52-e2-a0传输方向限定词通常会和前面例子演示的那些过滤器一起使用,来捕获流向或者流出某台主机的流量。举例来说,如果想捕获来自某台主机的流量,加入src限定词。src host 172.16.16.149当你在一个原语中没有指定一种类型限定符(host、net或者port)时,host限定词将作为默认选择。所以上面的那个例子也可以写成没有类型限定符的样子。dst 172.16.16.149(5)端口和协议过滤器不仅仅可以基于主机过滤,你还可以对基于每个数据包的端口进行过滤。端口过滤通常被用来过滤使用已知端口的服务和应用。举例来说,下面是一个只对8080端口进行流量捕获的简单过滤器的例子。port 8080如果想要捕获除8080端口外的所有流量,如下所示。!port 8080端口过滤器可以和传输方向限定符一起使用。举例来说,如果希望只捕获前往监听标准HTTP80端口的Web服务器的流量,使用dst限定符。dst port 80(6)协议过滤器协议过滤器可以让你基于特定协议进行数据包过滤。这通常被用于那些不是应用层的不能简单地使用特定端口进行定义的协议。所以如果你只想看看ICMP流量,可以使用下面这个过滤器。icmp如果你想看除了IPv6之外的所有流量,下面这个过滤器能够满足要求。!ip6(7)协议域过滤器BPF语法提供给我们的一个强大功能,就是hi我们可以通过检查协议头中的每一字节来创建基于那些数据的特殊过滤器。举例来说,假设我们想要基于ICMP过滤器的类型域进行过滤,而类型域位于数据包最开头也就是偏移量为0的位置,那么我们可以通过在协议限定符后输入由方括号括起的字节偏移量,在这个例子中就是icmp[0],来指定我们想在一个数据包内进行检查的位置。这样将返回一个1字节的整型值用于比较。比如只想要得到代表目标不可达(类型3)信息的ICMP数据包,我们在我们的过滤器表达式中令其等于3,如下所示。icmp[0]==3如果只想要检查代表echo请求(类型8)或echo回复(类型0)的ICMP数据包,使用带有OR运算符的两个原语。icmp[0]==8||icmp[0]==0这些过滤器尽管很好用,但是只能基于数据包头部的1个字节进行过滤。当然,你可以在方括号中偏移值的后面以冒号分割加上一个字节长度,来制定你希望返回给过滤器表达式的数据长度。举例来说,我们想要创建一个捕获所有以类型3代码1表示的目标不可达、主机不可达的ICMP数据包,它们都是彼此相邻的1字节字段,位于数据包头部偏移量为0的位置。那么我们通过创建一个检查数据包头部偏移量为0处为2个字节数据的过滤器,并与十六进制值0301(类型3、代码1)进行比较,如下所示。icmp[0:2]==0x0301一个常用的场景是只捕获带有RST标志的TCP数据包。但是RST位对应的比特位对应tcp[13]这个字节的数值4所在的那个二进制位。所以过滤器看上去是这样的。tcp[13]&4==4如果希望所有被设置了PSH标志(比特位代表数字8)的数据包,我们的过滤器应该会将其相应位置替换成这样。tcp[13]&8==8(8)包含有 DATA 的 IPv4 数据包ip[2:2] - ((ip[0]&0xf)<<2) - ((tcp[12]&0xf0)>>2) != 0IPv4 数据包总长度 - IPv4 数据包首部长度 - TCP 数据包首部长度 != 0,意味着 IPv4 数据包含有 DATA (9)TCP 端口范围在 1501-1540 的数据包(tcp[0:2] > 1500 and tcp[0:2] < 1550) or (tcp[2:2] > 1500 and tcp[2:2] < 1550) tcp portrange 1501-1549(10)Welchia wormicmp[icmptype] == icmp-echo and ip[2:2] == 92 and icmp[8:4] == 0xAAAAAAAA(11)HTTP GET requests 数据包port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420'G', 'E', 'T', ' ' (16 进制值分别对应为 47, 45, 54, 20;tcp[12] & 0xf0) >> 2 为数据偏移位,取 4 字节即为 GET 。0x504f5354 POST(12)Heartbleed Exploit 数据包tcp src port 443 and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4] = 0x18) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 1] = 0x03) and (tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04) and ((ip[2:2] - 4 * (ip[0] & 0x0F) - 4 * ((tcp[12] & 0xF0) >> 4) > 69)) tcp[((tcp[12] & 0xF0) >> 4 ) * 4] = 0x18 和 tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 1] = 0x03  TCP 数据偏移位,可简写为 tcp[((tcp[12] & 0xf0) >> 2):2] = 0x1803,18 为 heartbeat 报文,03 为 TLS 主版本号;tcp[((tcp[12] & 0xF0) >> 4 ) * 4 + 2] < 0x04,TLS 子版本号,等同于 tcp[((tcp[12] & 0xf0) >> 2) + 2] < 0x04;ip[2:2] - 4 * (ip[0] & 0x0F)  - 4 * ((tcp[12] & 0xF0) >> 4) > 69,TCP 数据包负载大于 69(13)运算符实例① To select all IPv4 HTTP packets to and from port 80, i.e. print only packets that contain data, not, for example, SYN and FIN packets and ACK-only packets.tcp port 80 and (((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>2)) != 0)All IPv4 HTTP packets to and from port 80tcp port 80表示过滤选择 tcp 80 端口的进出数据包 Packets that contain data包含有数据字段的 TCP 数据包,即要求 TCP payload 不为 0。ip[2:2]代表 IPv4 数据包总长度,单位为字节。(ip[0] & 0xf)<<2ip[0] & 0xf,等同于ip[0] & 0x0f,代表 IPv4 首部长度,单位为 4 字节,例如 00000101 值为 5。<<2,代表左移2位,在原值的基础上 *4 ,例如 00000101 值为 5 ,左移2位后变为 00010100,值为 20。最终 (ip[0] & 0xf)<<2 得到的是 IPv4 数据包首部实际长度,单位为字节。(tcp[12] & 0xf0)>>2tcp[12] & 0xf0,代表 TCP 首部长度,单位为 1/4 字节。>>2,代表右移2位,在原值的基础上 /4 ,例如 01010000 值为 80 ,右移2位后变为 00010100,值为 20。最终 (tcp[12] & 0xf0)>>2 得到的是 TCP 数据包首部实际长度,单位为字节。至此数值单位一致后,最终表达式((ip[2:2] - ((ip[0] & 0xf)<<2)) - ((tcp[12] & 0xf0)>>2)) != 0IPv4 数据包总长度 - IPv4 数据包首部长度 - TCP 数据包首部长度 != 0,意味着 IPv4 数据包含有 DATA,即 TCP payload 不为 0。② HTTP GET requests 数据包port 80 and tcp[((tcp[12] & 0xf0) >> 2):4] = 0x47455420HTTP 数据包port 80代表运行在端口 80 上的 HTTP 数据包。GET 请求tcp[12] & 0xf0) >> 2 ,在此为数据偏移位,也即 TCP 数据包首部长度。4,代表感兴趣的字节长度为 4 。tcp[((tcp[12] & 0xf0) >> 2):4]最终代表的是 TCP 数据包首部往后 4 个字节。而 'G', 'E', 'T', ' ' ,16 进制值分别对应为 47, 45, 54, 20;取 4 字节即为 GET 。 同理 0x504f5354 为 POST
0
0
0
浏览量2047
熊Sir

WireShark 捕获过滤器的超全使用教程——「捕获选项」弹框界面

「捕获选项」弹框界面(1)选项卡:Input① 接口接口:接口名称,某些接口允许或需要在捕获之前进行配置,这将由接口名称左侧的选项图标(❁)进行设置,单击图标将显示该接口的独立配置对话框② 流量流量:显示网络活动随时间变化的曲线图迷你图③ 链路层链路层:此接口捕获的数据包类型,在某些特殊情况下,可以修改链接层标头类型:在大多数情况下,您不必修改链接层标头类型,一些例外情况如下: 如果您是在以太网设备上捕获,您可能会选择 「Ethernet」或 「DOCSIS」 。如果您正在从Cisco Cable Modem 终端系统捕获流量,该系统将 DOCSIS 流量传输到要捕获的以太网,请选择「DOCSIS」,否则选择 「Ethernet」。如果您在某些版本的 BSD 上的 802.11 设备上进行捕获,您可以选择「Ethernet」或 「802.11」。「Ethernet」将导致捕获的数据包具有虚假的 (“cooked”) 以太网报头。「802.11」将使它们具有完整的 IEEE 802.11 报头。除非捕获需要由不支持 802.11 标头的应用程序读取,否则应选择「802.11」。如果您在连接到同步串行线的 Endace DAG 卡上进行捕获,您可能会选择 「PPP over serial」或「Cisco HDLC」。如果串行线路上的协议是 PPP ,请选择「PPP over serial」,如果串行线路的协议是 Cisco HDLC ,则选择「Cisco HDLC」。如果您是在连接到 ATM 网络的 Endace DAG 卡上进行捕获,您可以选择「RFC 1483 IP over ATM」或「Sun raw ATM」。如果捕获的唯一流量是 RFC 1483 LLC 封装的 IP ,或者如果捕获需要由不支持 SunATM 标头的应用程序读取,请选择「RFC 1483 IP over ATM」,否则选择「Sun raw ATM」。④ 混杂混杂:允许您在捕获时将此界面置于混杂模式,请注意,其他应用程序可能会覆盖此设置。⑤ 捕获长度(B)捕获长度: 快照长度或每个数据包要捕获的字节数,如果需要,例如出于性能或隐私原因,可以设置显式长度⑥ 缓冲区(MB)缓冲区:为捕获数据包而保留的内核缓冲区的大小,您可以根据需要增加或减少此值,但默认值通常就足够了⑦ 监控模式监控模式:允许您捕获完整的原始 802.11 标头,支持取决于接口类型、硬件、驱动程序和操作系统,请注意,启用此选项可能会断开您与无线网络的连接⑧ 捕获过滤器捕获过滤器:应用于此接口的捕获筛选器,您可以通过双击过滤器来编辑它,可以填写捕获过滤表达式(2)选项卡:输出输出:设置永久保存抓取结果文件路径(3)选项卡:选项选项:设置实时、名称解析、自动停止捕获定时、临时文件路径Display Options:显示选项Update list of packets in real-time:实时更新数据包列表Automatically scroll during live capture:在实时捕捉过程中自动滚动Show capture information during live capture:显示实时捕获过程中的捕获信息Name Resolution :名称解析Resolve MAC addresses:解析 MAC 地址Resolve network names:Resolve 网络名称Resolve transport names :Resolve 传输名称Stop capture automatical1y after…… :……后自动停止捕获Directory for temporary files :临时文件目录
0
0
0
浏览量2217
熊Sir

selenium-python安装(打开网站、操作元素)

1.安装pip install -U selenium注:-U就是指定下载最新版本的selenium 2. 控制浏览器 2.1 打开浏览器from selenium import webdriver # 打开浏览器 driver = webdriver.Chrome()或者,可以指定驱动路径:driver = webdriver.Chrome(executable_path=r'D:\Program Files\Python36\chromedriver.exe') 关闭浏览器及其对应驱动:driver.quit()还可以通过上下文来控制其执行操作后自动关闭:with webdriver.Chrome(executable_path='chromedriver.exe') as driver: driver......2.2 打开网站driver.get('https://blog.csdn.net/testleaf/article/details/123269042')延时3秒:import time time.sleep(3)2.3 定位元素传说中的八大元素定位方法:driver.find_element_by_id() # 通过id属性定位(唯一);常用 driver.find_element_by_xpath() # 通过xpath表达式定位;常用 driver.find_element_by_class_name() # 通过类名定位;常用 driver.find_element_by_name() # 通过name属性定位 driver.find_element_by_tag_name() # 通过标签名定位 driver.find_element_by_css_selector() # 通过css选择器定位 driver.find_element_by_link_text() # 通过链接标签的text类容定位 driver.find_element_by_partial_link_text() # 通过匹配链接标签的text类容定位上面的都是找到第一个元素,每一个方法都有对应多个元素的方法:如:driver.find_elements_by_id()示例1:driver.find_element_by_id(“toolbar-search-input”)示例2:driver.find_element_by_name(“wd”)2.4 操作元素# 定位搜索框 element = driver.find_element_by_id("toolbar-search-input") # 输入搜索内容 element.send_keys('web自动化框架:selenium入门') # 定位搜索按钮 search_button = driver.find_element_by_id('toolbar-search-button') # 点击搜索按钮 search_button.click()
0
0
0
浏览量2057
熊Sir

Selenium 八大定位法

Selenium 八大定位法2.1 ID定位HTML Tag 的 id 属性值是唯一的,故不存在根据 id 定位多个元素的情况。下面以在百度首页搜索框输入文本“python”为例。搜索框的 id 属性值为“kw”,如图1.1所示:代码如下,“find_element_by_id”方法已废弃,使用find_element(By.ID, 'kw')from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Firefox() # 需要将浏览器驱动添加到环境变量中 # 打开百度 driver.get('https://www.baidu.com/') # 通过id,在搜索输入框中输入文本“python” driver.find_element(By.ID, 'kw').send_keys('python') # 点击搜索 driver.find_element(By.ID, 'su').click() # 关闭浏览器 driver.close() 2.2 name 定位以上百度搜索框也可以用 name 来实现,如图 1.1 所示,其 name 属性值为“wd”,方法“find_element(By.NAME, 'wd')”表示通过 name 来定位代码如下:driver = webdriver.Firefox() # 打开百度 driver.get('https://www.baidu.com/') # 通过name,在搜索输入框中输入文本“自动化测试” driver.find_element(By.NAME, 'wd').send_keys('自动化测试') # 点击搜索 driver.find_element(By.ID, 'su').click() # 关闭浏览器 driver.close()注意:用 name 方式定位需要保证 name 值唯一,否则定位失败。2.3 class 定位以百度首页搜索框为例,如图 1.1所示,其 class 属性值为“s_ipt”,“By.CLASS_NAME, 's_ipt'”表示通过 class_name 来定位代码如下:driver = webdriver.Firefox() # 打开百度 driver.get('https://www.baidu.com/') # 通过class,在搜索输入框中输入文本“web测试” driver.find_element(By.CLASS_NAME, 's_ipt').send_keys('web测试') # 点击搜索 driver.find_element(By.ID, 'su').click() # 关闭浏览器 driver.close()2.4 link_text 定位代码如下:driver = webdriver.Firefox() # 打开百度 driver.get('https://www.baidu.com/') # 通过link_text定位,点击‘新闻’超链接 driver.find_element(By.LINK_TEXT, '新闻').click() # 关闭浏览器 driver.close()注意:用此方法定位元素超链接,中文字需要写全。2.5 partial_link_text 定位即用超链接文字的部分文本来定位元素,类似数据库的模糊查询。以“新闻”超链接为例,只需“新”一个字即可,即取超链接全部文本的一个子集。代码如下:driver = webdriver.Firefox() # 打开百度 driver.get('https://www.baidu.com/') # 通过partial_link_text定位,用超链接文字的部分文本来定位元素,类似数据库的模糊查询 driver.find_element(By.PARTIAL_LINK_TEXT, '新').click() # 关闭浏览器 driver.close()2.6 tag_name 定位tag_name 定位即通过标签名称定位,如图 1.6所示,定位标签“form”并打印标签属性值“name”。代码如下:driver = webdriver.Firefox() # 打开百度 driver.get('https://www.baidu.com/') # tag_name 定位即通过标签名称定位 print(driver.find_element(By.TAG_NAME, 'form').get_attribute('name'))成功后控制台输出“f”:2.7 CSS 定位CSS 定位的优点是速度快、语法简洁。表 1.1 中的内容出自 W3School 的 CSS 参考手册。CSS 定位的选择器有十几种,在本节中主要介绍几种比较常用的选择器。仍以百度搜索框为例,代码如下:driver = webdriver.Firefox() # 打开百度 driver.get('https://www.baidu.com/') # 以class选择器为例,实现CSS定位,在搜索框输入“python3” driver.find_element(By.CSS_SELECTOR, '.s_ipt').send_keys('python3') # 以id定位语法结构为:#加 id 名,实现CSS定位,在搜索框输入“python3” driver.find_element(By.CSS_SELECTOR, '#kw').send_keys('python3') # CSS 定位主要利用属性 class 和 id 进行元素定位。也可以利用常规的标签名称来定位,如输入框标签“input”,在标签内部又设置了属性值为“name=’wd’” driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('python3') # CSS 定位方式可以使用元素在页面布局中的绝对路径来实现元素定位。百度首页搜索输入框元素的绝对路 # 径为“html>body>div>div>div>div>div>form>span>input[name="wd"]” driver.find_element(By.CSS_SELECTOR, 'html>body>div>div>div>div>div>form>span>input[name="wd"]').send_keys('python3') # CSS 定位也可以使用元素在页面布局中的相对路径来实现元素定位。相对路径的写法和直接利用标签名称来定位,两者 # 的代码实现的功能是一致的 driver.find_element(By.CSS_SELECTOR, "input[name='wd']").send_keys('python3') # 点击搜索 driver.find_element(By.ID, 'su').click() # 关闭浏览器 driver.close()2.8 XPath 定位通过 XPath 来定位元素的方式,对比较难以定位的元素来说很有效,几乎都可以解决,特别是对于有些元素没有 id、name 等属性的情况。XPath 是 XML Path 语言的缩写,是一种用来确定 XML 文档中某部分位置的语言。它在 XML 文档中通过元素名和属性进行搜索,主要用途是在 XML 文档中寻找节点。XPath定位比 CSS 定位有更大的灵活性。XPath 可以向前搜索也可以向后搜索,而 CSS 定位只能向前搜索,但是 XPath 定位的速度比 CSS 慢一些。XPath 语言包含根节点、元素、属性、文本、处理指令、命名空间等。以下文本为 XML实例文档,用于演示 XML 的各种节点类型,便于理解 XPath。<?xml version = "1.0" encoding = "utf-8" ?> <!-- 这是一个注释节点 --> <animalList type="mammal"> <animal categoruy = "forest"> <name>Tiger</name> <size>big</size> <action>run</action> </animal> </animalList>其中<animalList>为文档节点,也是根节点;<name>为元素节点;type=“mammal”为属性节点。节点之间的关系:• 父节点。每个元素都有一个父节点,如上面的 XML 示例中,animal 元素是 name、size,以及 action 元素的父节点。• 子节点。与父节点相反,这里不再赘述。• 兄弟节点,有些也叫同胞节点。它表示拥有相同父节点的节点。如上代码所示,name、size 和 action 元素都是同胞节点。• 先辈节点。它是指某节点的父节点,或者父节点的父节点,以此类推。如上代码所示,name 元素节点的先辈节点有 animal 和 animalList。• 后代节点。它表示某节点的子节点、子节点的子节点,以此类推。如上代码所示,animalList 元素节点的后代节点有 animal、name 等。仍以百度搜索框为例,代码如下:driver = webdriver.Firefox() # 打开百度 driver.get('https://www.baidu.com/') # XPath 有多种定位策略,最简单直观的就是写出元素的绝对路径。 driver.find_element(By.XPATH, '/html/body/div/div/div/div/div/form/span/input').send_keys('python3') # XPath还可以使用元素的属性值来定位。//input 表示当前页面某个 input 标签,[@id='kw'] 表示这个元素的 id 值是 kw。 driver.find_element(By.XPATH, "//input[@id='kw']").send_keys('python3') # 如果一个元素本身没有可以唯一标识这个元素的属性值,我们可以查找其上一级元素。 # form[@class='fm has-soutu']通过 class 定位到父元素,后面的/span/input 表示父元素下面的子元素。 driver.find_element(By.XPATH, "//form[@class='fm has-soutu']/span/input").send_keys('python3') # 如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来查找元素 driver.find_element(By.XPATH, "//input[@id='kw' and @class='s_ipt']").send_keys('python3') # 点击搜索 driver.find_element(By.ID, 'su').click() # 关闭浏览器 driver.close()
0
0
0
浏览量2049
熊Sir

selenium学习使用操作大全(Python版)

Selenium学习使用操作大全(Python版)
0
0
0
浏览量2431
熊Sir

WireShark 捕获过滤器的超全使用教程

WireShark 捕获过滤器的超全使用教程
0
0
0
浏览量2871
熊Sir

【Selenium学习】Selenium

【Selenium学习】Selenium
0
0
0
浏览量2138
熊Sir

Web的自动化测试工具Selenium——第08节 切换操作

第08层 切换操作在 selenium 操作页面的时候,可能会因为点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时候 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。窗口切换需要使用 switch_to.windows() 方法。1. 窗口切换在 selenium 操作页面的时候,可能会因为点击某个链接而跳转到一个新的页面(打开了一个新标签页),这时候 selenium 实际还是处于上一个页面的,需要我们进行切换才能够定位最新页面上的元素。窗口切换需要使用 switch_to.windows() 方法。from selenium import webdriver handles = [] driver = webdriver.Chrome() driver.get('https://blog.csdn.net/') # 设置隐式等待 driver.implicitly_wait(3) # 获取当前窗口的句柄 handles.append(driver.current_window_handle) # 点击 python,进入分类页面 driver.find_element_by_xpath('//*[@id="mainContent"]/aside/div[1]/div').click() # 切换窗口 driver.switch_to.window(driver.window_handles[-1]) # 获取当前窗口的句柄 handles.append(driver.current_window_handle) print(handles) print(driver.window_handles)上面代码在点击跳转后,使用 switch_to 切换窗口,window_handles返回的 handle 列表是按照页面出现时间进行排序的,最新打开的页面肯定是最后一个,这样用 driver.window_handles[-1] + switch_to 即可跳转到最新打开的页面了。那如果打开的窗口有多个,如何跳转到之前打开的窗口,如果确实有这个需求,那么打开窗口是就需要记录每一个窗口的 key(别名) 与 value(handle),保存到字典中,后续根据 key 来取 handle 。2. 表单切换1. iframe 切换很多页面也会用带 frame/iframe 表单嵌套,对于这种内嵌的页面 selenium 是无法直接定位的,需要使用 switch_to.frame() 方法将当前操作的对象切换成 frame/iframe 内嵌的页面。switch_to.frame() 默认可以用的 id 或 name 属性直接定位,但如果 iframe 没有 id 或 name ,这时就需要使用 xpath 进行定位。 iframe = driver.find_element(By.ID, "my-iframe-id") driver.switch_to.frame(iframe)2.切换回默认内容:如果在 iframe 中完成操作后,要切换回主页面,可以使用 switch_to.default_content() 方法: driver.switch_to.default_content()这些方法可以帮助你在 Selenium 中进行窗口和 iframe 的切换操作。记住,切换窗口或 iframe 之前,你需要获取到对应的窗口句柄或 iframe 元素。3. 举例确切地,要找到位于 iframe 中的元素,你需要按照以下步骤进行操作:1.首先,你需要找到 iframe 元素本身,然后切换到该 iframe2.在 iframe 内部,你可以使用常规的方法来查找和操作元素以下是一个示例,演示如何切换到 iframe 并找到其中的元素:from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get("https://example.com") # 找到 iframe 元素,可以根据其 ID、名称或其他属性来定位 iframe = driver.find_element(By.ID, "my-iframe-id") # 切换到 iframe driver.switch_to.frame(iframe) # 在 iframe 中查找元素并执行操作 element_inside_iframe = driver.find_element(By.CLASS_NAME, "element-class") element_inside_iframe.click() # 切换回主页面 driver.switch_to.default_content()在这个示例中,我们首先通过其 ID 找到了 iframe 元素,然后使用 driver.switch_to.frame() 切换到了 iframe 中,接下来在 iframe 内查找元素并执行操作。最后,使用 driver.switch_to.default_content() 切换回主页面。记住,要确保你正确找到了 iframe 元素,以及在切换到 iframe 后,使用 driver.find_element() 方法来查找位于 iframe 内部的元素。
0
0
0
浏览量2067
熊Sir

Web的自动化测试工具Selenium——第04节 浏览器控制

第04节 浏览器控制1. 修改浏览器窗口大小webdriver 提供 set_window_size() 方法来修改浏览器窗口的大小from selenium import webdriver # 初始化浏览器驱动程序,这里使用Chrome作为示例 driver = webdriver.Chrome() # 最大化浏览器窗口 driver.maximize_window() # 或者设置特定大小的窗口 # driver.set_window_size(1024, 768) # 传递所需的宽度和高度 # 访问网页 driver.get("https://www.example.com") # 在这里执行其他操作... # 关闭浏览器 driver.quit()2. 浏览器前进&后退要在 Selenium 中执行浏览器的前进和后退操作,你可以使用 forward() 和 back() 方法# 在这里执行其他操作... # 执行前进操作 driver.forward() # 执行后退操作 driver.back() # 在这里执行其他操作...请注意,前进和后退操作通常依赖于浏览器的历史记录。如果浏览器历史记录中没有前进或后退的页面,这些方法可能不会执行任何操作。因此,在使用前进和后退之前,确保浏览器已经访问了多个页面以建立历史记录3. 浏览器刷新要在Selenium中执行浏览器刷新操作,你可以使用refresh()方法。以下是一个示例,演示如何在Python中使用Selenium来刷新浏览器页面:from selenium import webdriver # 刷新浏览器页面 driver.refresh() 这个方法将会重新加载当前页面,就像用户手动点击浏览器的刷新按钮一样。刷新操作可用于重新加载页面内容,以确保你的测试脚本在页面状态变化时可以重新加载页面4. 浏览器窗口切换在 Selenium 中,要切换浏览器窗口,你可以使用 window_handles 属性来获取当前打开的所有窗口句柄,然后使用 switch_to.window() 方法切换到特定的窗口句柄。以下是一个示例,演示如何在 Python 中使用 Selenium 来切换浏览器窗口:from selenium import webdriver # 初始化浏览器驱动程序,这里使用Chrome作为示例 driver = webdriver.Chrome() # 打开第一个网页 driver.get("https://www.example1.com") # 打开第二个网页 driver.execute_script("window.open('https://www.example2.com', '_blank');") # 获取所有窗口句柄 window_handles = driver.window_handles # 切换到第二个窗口 driver.switch_to.window(window_handles[1]) # 在第二个窗口执行操作 # 切换回第一个窗口 driver.switch_to.window(window_handles[0]) # 在第一个窗口执行操作 # 关闭浏览器 driver.quit()在上述示例中,我们首先打开两个不同的网页,然后使用 window_handles 获取所有窗口句柄。通过切换到不同的窗口句柄,我们可以在不同的浏览器窗口中执行操作请注意,窗口句柄的索引通常是从 0 开始的,所以第一个窗口的句柄是 window_handles[0] ,第二个窗口的句柄是 window_handles[1] ,依此类推。你可以根据需要切换到其他窗口句柄以执行操作窗口句柄(Window Handle)是一个用来唯一标识浏览器窗口的标识符或引用。每当你打开一个新的浏览器窗口或标签页时,浏览器会为该窗口分配一个唯一的句柄。这些句柄是在浏览器级别分配的,用于标识不同的浏览器窗口或标签页,以便在多窗口浏览器环境中进行切换和操作在 Selenium 等自动化测试工具中,窗口句柄用于控制和切换不同的浏览器窗口,以便在多个窗口之间执行操作。通过获取窗口句柄,你可以将焦点从一个窗口切换到另一个窗口,从而执行各种操作,例如在不同窗口之间切换、操作弹出窗口等窗口句柄通常是一个字符串,你可以使用它来定位和操作特定的浏览器窗口。在 Selenium 中,你可以使用 window_handles 属性来获取当前打开的所有窗口句柄,然后使用 switch_to.window() 方法切换到特定的窗口句柄。这使得在多窗口浏览器环境中进行自动化测试或操作变得更加容易5. 常见操作当使用 Selenium WebDriver 或类似的自动化测试工具时,这些方法可以用于与 Web 页面的元素进行交互和获取信息。以下是每个方法的使用示例:1. send_keys(): 模拟输入指定内容from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 找到输入框元素并输入文本 input_element = driver.find_element_by_id("username") input_element.send_keys("myusername") 在这个例子中,send_keys() 方法模拟在具有 id 为 “username” 的输入框中输入 “myusername”2. clear(): 清除文本内容# 清除输入框中的文本 input_element.clear()clear() 方法用于清除之前输入框中的文本内容3. is_displayed(): 判断该元素是否可见# 检查元素是否可见 if input_element.is_displayed(): print("Input element is visible on the page.") else: print("Input element is not visible on the page.")is_displayed() 方法用于检查页面上的元素是否可见。在这个例子中,如果输入框可见,将会打印 “Input element is visible on the page.”4. get_attribute(): 获取标签属性值# 获取元素的href属性值 link_element = driver.find_element_by_link_text("Example Link") href_value = link_element.get_attribute("href") print("Href attribute value is:", href_value)size 是一个属性,用于返回元素的宽度和高度。在这个例子中,它获取输入框元素的尺寸6. text: 返回元素文本# 获取元素的文本内容 paragraph_element = driver.find_element_by_css_selector("p") paragraph_text = paragraph_element.text print("Paragraph text is:", paragraph_text)text 是一个属性,用于返回元素的文本内容。在这个例子中,它获取 <p> 元素的文本内容6. 示例 CSDN页面元素交互# coding=utf-8 import time from selenium import webdriver from selenium.webdriver.common.by import By driver = webdriver.Chrome() driver.get('https://www.csdn.net/') time.sleep(2) # 定位搜索输入框 text_label = driver.find_element(By.ID, "toolbar-search-input") # 在搜索框中输入 东离与糖宝 text_label.send_keys('东离与糖宝') time.sleep(2) # 清除搜索框中的内容 text_label.clear() time.sleep(2) # 输出搜索框元素是否可见 print(text_label.is_displayed()) # 输出placeholder的值 print(text_label.get_attribute('placeholder')) # 定位搜索按钮 button = driver.find_element(By.ID, 'toolbar-search-button') # 输出按钮的大小 print(button.size) # 输出按钮上的文本 print(button.text) '''输出内容 True 搜CSDN {'height': 32, 'width': 88} 搜索 '''
0
0
0
浏览量2112
熊Sir

Web的自动化测试工具Selenium——第07节 元素等待

第07节 元素等待现在的大多数的 Web 应用程序是使用 Ajax 技术。当一个页面被加载到浏览器时, 该页面内的元素可以在不同的时间点被加载。这使得定位元素变得困难, 如果元素不再页面之中,会抛出 ElementNotVisibleException 异常。 使用 waits, 我们可以解决这个问题。waits 提供了一些操作之间的时间间隔- 主要是定位元素或针对该元素的任何其他操作。Selenium Webdriver 提供两种类型的 waits - 隐式和显式。 显式等待会让 WebDriver 等待满足一定的条件以后再进一步的执行。 而隐式等待让 Webdriver 等待一定的时间后再才是查找某元素。1. 隐式等待隐式等待(Implicit Wait):设置一个全局等待时间,如果 Selenium 无法立即找到元素,它会等待指定的时间,然后再次尝试。这对于整个测试过程都适用from selenium import webdriver driver = webdriver.Chrome() driver.implicitly_wait(10) # 设置等待时间为10秒 driver.get("https://example.com") element = driver.find_element_by_id("myElement") 2. 显示等待显式等待(Explicit Wait):显式等待允许你为特定操作等待特定条件。你可以等待元素可见、可点击等条件。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC driver = webdriver.Chrome() driver.get("https://example.com") # 等待元素可见 element = WebDriverWait(driver, 10).until( EC.visibility_of_element_located((By.ID, "myElement")) ) # 等待元素可点击 element = WebDriverWait(driver, 10).until( EC.element_to_be_clickable((By.ID, "myElement")) )3. 自定义等待自定义等待:你还可以根据需要创建自定义等待条件。例如,你可以等待元素的文本内容等于特定值。from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait def wait_for_element_with_text(driver, by, value, text, timeout=10): return WebDriverWait(driver, timeout).until( lambda driver: driver.find_element(by, value).text == text ) driver = webdriver.Chrome() driver.get("https://example.com") # 等待元素文本内容等于特定值 wait_for_element_with_text(driver, By.ID, "myElement", "Hello, World!")4. 强制等待将隐式等待改为强制等待(使用 time.sleep())通常不是一个好的做法,因为它会导致代码效率低下并且可能会浪费时间。import time from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 替换为你要访问的网页URL # 假设你已经定位到了包含文本的 WebElement 对象 element = driver.find_element_by_css_selector("span.red-packet-icon-mini > span.num") # 使用强制等待 time.sleep(5) # 强制等待 5 秒 # 获取 <span> 元素的文本内容 text_content = element.text # 打印文本内容 print(text_content)值得一提的是,对于定位不到元素的时候,从耗时方面隐式等待和强制等待没什么区别
0
0
0
浏览量2057
熊Sir

Web的自动化测试工具Selenium——第05节 鼠标控制

第05节 鼠标控制1.单击元素左键不需要用到 ActionChainsfrom selenium import webdriver from selenium.webdriver.common.action_chains import ActionChains driver = webdriver.Chrome() driver.get("https://example.com") element = driver.find_element_by_id("my_element") # 单击元素 ActionChains(driver).click(element).perform()2.双击元素# 双击元素 ActionChains(driver).double_click(element).perform()3.在元素上右键单击# 右键单击元素 ActionChains(driver).context_click(element).perform()4.在元素上悬停(鼠标悬停)模拟悬停的作用一般是为了显示隐藏的下拉框# 鼠标悬停在元素上 ActionChains(driver).move_to_element(element).perform() 5.拖拽元素到另一个位置# 拖拽元素到目标位置 target_element = driver.find_element_by_id("target_element") ActionChains(driver).drag_and_drop(element, target_element).perform()
0
0
0
浏览量2086
熊Sir

Web的自动化测试工具Selenium概述-第01节 Selenium概述

第01节 Selenium概述Selenium 是一个Web的自动化测试工具,最初是为网站自动化测试而开发的,Selenium 可以直接运行在浏览器上,它支持所有主流的浏览器因为 Selenium 可以控制浏览器发送请求,并获取网页数据,因此可以应用于爬虫领域Selenium 可以根据我们的指令,让浏览器自动加载页面,获取需要的数据,甚至页面截屏,或者判断网站上某些动作是否发生Selenium 自己不带浏览器,不支持浏览器的功能,它需要与第三方浏览器结合在一起才能使用Selenium 库的版本不同对应的方法名也会有所不同
0
0
0
浏览量2418
熊Sir

Web的自动化测试工具Selenium——第06节 键盘控制

第06节 键盘控制1.输入文本使用 send_keys 方法可以将文本输入到活动元素中,就像用户手动键入一样from selenium import webdriver driver = webdriver.Chrome() driver.get("https://example.com") # 定位到文本输入框并输入文本 text_input = driver.find_element_by_id("my_textbox") text_input.send_keys("Hello, World!")2.按键使用 send_keys 方法可以模拟特定按键的操作,如回车键、退格键、Tab键等。from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get("https://example.com") # 模拟按下回车键 text_input = driver.find_element_by_id("my_textbox") text_input.send_keys(Keys.ENTER) 3.组合键你可以使用 Keys 类来模拟键盘上的组合键,例如 Ctrl+C(复制)和Ctrl+V(粘贴)。from selenium import webdriver from selenium.webdriver.common.keys import Keys driver = webdriver.Chrome() driver.get("https://example.com") # 模拟Ctrl+C(复制) text_input = driver.find_element_by_id("my_textbox") text_input.send_keys(Keys.CONTROL, 'c') # 模拟Ctrl+V(粘贴) another_text_input = driver.find_element_by_id("another_textbox") another_text_input.send_keys(Keys.CONTROL, 'v') 4. 其他键盘操作
0
0
0
浏览量2072
熊Sir

Web的自动化测试工具Selenium——第09节 滚轮操作

第09节 滚轮操作要在 Selenium 中模拟滚轮操作,你可以使用 ActionChains 类的 send_keys 方法,将 Keys.PAGE_DOWN 或 Keys.SPACE 等按键发送到页面。这将模拟向下滚动页面。在你的示例代码中,你已经创建了一个 ActionChains 对象,所以你只需要在循环中使用 send_keys 方法来模拟滚轮操作。以下是如何修改你的代码以模拟滚轮向下滚动:from selenium.webdriver.common.keys import Keys # ... # 计算滚动的时间间隔(以毫秒为单位) scroll_interval = 500 # 每500毫秒滚动一次 # 创建ActionChains对象 action_chains = ActionChains(driver) # 模拟滚动 for _ in range(int(scroll_duration * 1000 / scroll_interval)): action_chains.send_keys(Keys.PAGE_DOWN).perform() time.sleep(scroll_interval / 1000)这段代码会模拟按下 Page Down 键来滚动页面。你可以根据需要调整 scroll_interval 和 scroll_duration 来控制滚动的速度和持续时间。
0
0
0
浏览量2079
熊Sir

Web的自动化测试工具Selenium——第03节 定位页面元素

第03节 定位页面元素定位一个元素用 element,定位一组元素用 elements1. 打开指定页面1. 不切换新窗口要使用 Selenium 来打开指定页面,首先需要初始化一个 WebDriver 实例,然后使用该实例打开目标页面。下面是一个使用 Python 和 Selenium 的示例,演示如何打开指定的页面:from selenium import webdriver # 初始化一个WebDriver实例,这里使用Chrome作为浏览器 driver = webdriver.Chrome() # 打开指定的页面,将URL替换为你要访问的网页地址 url = "https://www.example.com" driver.get(url) # 在这里,你可以执行与打开页面相关的操作 # 最后,关闭浏览器窗口 driver.quit()在上述代码中,我们首先导入 Selenium 的 webdriver 模块,并初始化了一个 Chrome 浏览器的 WebDriver 实例。然后,使用 get 方法打开指定的页面,将目标网页的 URL 替换为你要访问的网页地址。之后,你可以在页面上执行与你的测试或任务相关的操作,然后使用 quit 方法关闭浏览器窗口2. 切换新窗口上面的方法会在当前窗口或标签页中打开一个新的页面,将当前页面替换为新的 URL ,使用 window.open(url) 打开新页面:driver.execute_script("window.open('https://www.example.com', '_blank');") # 使用JavaScript打开一个新页面这种方法使用 execute_script 方法执行 JavaScript 代码,在新的浏览器窗口或标签页中打开指定的 URL。'_blank' 参数告诉浏览器在新窗口或标签页中打开 URL。这种方式适用于在新窗口中打开页面,而不替换当前页面请注意,如果你使用 window.open() 方法打开新页面,你可能需要使用 driver.window_handles 和 driver.switch_to.window() 来管理不同窗口之间的切换,就像后面提到的窗口句柄一样。这可以让你在不同的浏览器窗口中执行操作总之,execute_script 方法通常与其他 Selenium 方法一起使用,用于执行 JavaScript 以实现特定的交互和操作,但它本身不用于打开新页面3. 保持浏览器窗口打开默认情况下,Selenium WebDriver 在脚本执行结束后会关闭浏览器窗口,但通过将选项 "detach" 设置为 True,你可以使浏览器窗口保持打开状态,以便手动进行操作from selenium import webdriver # 创建ChromeOptions对象 options = webdriver.ChromeOptions() # 添加选项,防止浏览器自动关闭 options.add_experimental_option("detach", True) # 初始化一个WebDriver实例,将选项传递给Chrome driver = webdriver.Chrome(options=options) # 打开指定的页面 url = "https://www.csdn.net" driver.get(url) # 在这里,你可以执行与打开页面相关的操作 # 手动关闭浏览器时,可以保持它打开2. id 定位要使用 Selenium 通过元素的 ID 进行定位,你可以使用 By.ID 选择器和 find_element 方法。以下是如何通过元素的ID进行定位的示例:from selenium import webdriver # 初始化一个WebDriver实例,这里使用Chrome作为浏览器 driver = webdriver.Chrome() # 打开指定的页面 url = "https://www.example.com" driver.get(url) # 通过元素的ID进行定位并执行操作 element = driver.find_element(By.ID, "element_id") # 在这里,你可以执行与该元素相关的操作,例如单击、输入文本等 element.click() # 最后,关闭浏览器窗口 driver.quit()在上述示例中,driver.find_element(By.ID, "element_id") 通过元素的ID属性来定位元素,并将其存储在变量 element 中,然后可以执行与该元素相关的操作。记得将 "element_id" 替换为你要查找的元素的实际 ID。3. name 定位# 通过元素的name属性进行定位并执行操作 element = driver.find_element(By.NAME,"element_name")4. class 定位# 通过元素的CSS类名进行定位并执行操作 element = driver.find_element(By.By.CLASS_NAME, ".element_class")5. tag 定位每个 tag 往往用来定义一类功能,所以通过 tag 来识别某个元素的成功率很低,每个页面一般都用很多相同的 tag# 通过元素的标签名进行定位并执行操作 element = driver.find_element(By.TAG_NAME,"element_tag")element_tag 在示例代码中代表你要查找的元素的 HTML 标签名,例如 < div >, < a >, < p >等。具体来说,如果你要查找一个 < div > 元素,你可以将 element_tag 替换为 "div" ,如果你要查找一个 < a > 元素,你可以将 element_tag 替换为 "a",以此类推6. xpath 定位XPath(XML Path Language)是一种用于在 XML 文档中定位元素的语言,也适用于HTML 文档,因为 HTML 是一种基于 XML 的标记语言的变体。XPath 是一种功能强大的元素定位方法,它允许你准确地定位网页上的元素,无论它们在文档中的位置如何。以下是XPath定位的一些示例:1. 通过元素名称定位:定位所有的链接元素://a定位所有的段落元素://p定位第一个标题元素://h12. 通过元素属性定位:定位具有特定 id 属性的元素://*[@id='element_id']定位具有特定 class 属性的元素://*[@class='element_class']3. 通过文本内容定位:定位包含特定文本的元素://*[text()='要查找的文本']定位以特定文本开头的元素://*[starts-with(text(), '开头文本')]定位包含特定文本的链接://a[contains(text(), '链接文本')]4. 通过元素层次结构定位:定位父元素的子元素://div[@id='parent_id']/p(查找 id 属性为 'parent_id' 的 < div > 元素下的所有 < p > 元素)定位祖先元素的子元素//div[@class='grandparent_class']//span(查找 class 属性为 'grandparent_class' 的祖先元素下的所有< span >元素)5. 使用逻辑运算符:定位同时满足多个条件的元素://input[@type='text' and @name='username'](查找type属性为 'text' 且 name 属性为 'username' 的输入框)这些只是 XPath 的一些基本示例,XPath具有非常丰富的语法和功能,你可以根据需要组合和定制不同的条件来定位元素。在Selenium中,你可以使用 find_element + By.XPATH 方法来实现 XPath 定位,例如:element = driver.find_element(By.XPATH,"//a[contains(text(), '链接文本')]")这将查找包含特定文本的链接元素,你可以根据需要修改 XPath 表达式来定位不同的元素。6. 示例<html> <head>...<head/> <body> <div id="csdn-toolbar"> <div class="toolbar-inside"> <div class="toolbar-container"> <div class="toolbar-container-left">...</div> <div class="toolbar-container-middle"> <div class="toolbar-search onlySearch"> <div class="toolbar-search-container"> <input id="toolbar-search-input" autocomplete="off" type="text" value="" placeholder="C++难在哪里?">根据上面的标签需要定位 最后一行 input 标签,以下列出了四种方式,xpath 定位的方式多样并不唯一,使用时根据情况进行解析即可。# 绝对路径(层级关系)定位 driver.find_element(By.XPATH, "/html/body/div/div/div/div[2]/div/div/input[1]") # 利用元素属性定位 driver.find_element(By.XPATH, "//*[@id='toolbar-search-input']")) # 层级+元素属性定位 driver.find_element(By.XPATH, "//div[@id='csdn-toolbar']/div/div/div[2]/div/div/input[1]") # 逻辑运算符定位 driver.find_element(By.XPATH, "//*[@id='toolbar-search-input' and @autocomplete='off']")7. css 选择器CSS 使用选择器来为页面元素绑定属性,它可以较为灵活的选择控件的任意属性,一般定位速度比 xpath 要快,使用CSS 选择器进行元素定位在 Selenium 中是非常常见和方便的。以下是一些常见的 CSS 选择器示例:1. 通过元素名称定位:定位所有的链接元素:a定位所有的段落元素:p定位所有的按钮元素:button2. 通过元素ID定位:定位具有特定 ID属性的元素:#element_idelement = driver.find_element(By.CSS_SELECTOR,"#element_id")3. 通过类名定位:定位具有特定 class 属性的元素:.element_classelement = driver.find_element(By.CSS_SELECTOR,".element_class")4. 通过元素属性定位:定位具有特定属性值的元素:[attribute=‘value’]element = driver.find_element(By.CSS_SELECTOR,"[name='username']")5. 通过属性值的部分匹配:定位包含特定属性值的元素:[attribute*=‘value’]element = driver.find_element(By.CSS_SELECTOR,"[href*='example.com']")6. 通过组合条件:定位同时满足多个条件的元素:.class1.class2element = driver.find_element(By.CSS_SELECTOR,".element_class1.element_class2")7. 子元素定位:定位父元素的子元素:#parent_id > .child_classelement = driver.find_element(By.CSS_SELECTOR,"#parent_id > .child_class")8. 伪类选择器:例如 定位鼠标悬停的元素::hoverelement = driver.find_element(By.CSS_SELECTOR,"a:hover")8. link 定位使用 Selenium 来定位超链接(link)元素通常涉及到查找带有 <a> 标签的元素,这是 HTML 中的链接标签。你可以使用不同的方法来定位超链接,如通过文本内容、链接文本、部分链接文本等。以下是一些常见的链接定位示例:1.通过链接文本(完全匹配)定位:使用链接的文本内容来定位,确保文本与链接完全匹配: # 查找所有链接文本为"下一页"的元素 element = driver.find_elements(By.LINK_TEXT, "文本")2.通过链接文本(部分匹配)定位:使用链接的部分文本内容来定位,可以匹配链接文本的一部分: element = driver.find_element(By.PARTIAL_LINK_TEXT,"部分文本")例如,如果你的链接文本是"点击这里以获取更多信息",你可以使用"点击这里"或"获取更多信息"来进行部分匹配。这些方法非常方便,特别是当你知道链接的文本内容时。但请注意,它们对文本大小写敏感,所以确保文本内容的大小写与链接文本匹配。要查找多个链接,你可以使用 find_element**s**(By.LINK_TEXT, "文本") 或 find_element**s**(By.PARTIAL_LINK_TEXT,"部分文本"),它们会返回一个元素列表,你可以在列表中迭代查找多个链接元素。示例:elements = driver.find_elements(By.PARTIAL_LINK_TEXT,"部分文本") for element in elements: print(element.text)这将打印所有包含"部分文本"的链接文本的链接元素。9. 示例 有道翻译访问有道翻译网站,输入单词,并获取翻译后的内容import time from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC # 创建ChromeOptions对象 options = webdriver.ChromeOptions() # 添加选项,防止浏览器自动关闭 options.add_experimental_option("detach", True) # 创建Chrome WebDriver driver = webdriver.Chrome(options=options) # 打开有道翻译页面 driver.get("https://fanyi.youdao.com/") # 等待输入框可见 input_element = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "js_fanyi_input")) ) # 输入内容 input_element.send_keys("hello") # 如果有广告弹出框,关闭它 try: close_btn = driver.find_element(By.CSS_SELECTOR, ".close") close_btn.click() except Exception: pass # 如果没有广告,继续执行 # 等待翻译结果出现 transTarget = WebDriverWait(driver, 10).until( EC.presence_of_element_located((By.ID, "js_fanyi_output_resultOutput")) ) # 输出翻译结果 print(transTarget.text) # 关闭浏览器 # driver.quit()
0
0
0
浏览量2271
熊Sir

Web的自动化测试工具Selenium--第02节 安装浏览器驱动(以Google为例)

第02节 安装浏览器驱动(以Google为例)1. 确认浏览器版本2. 下载对应版本的驱动3. 如何下载历史版本的 chorm获得浏览器版本号访问 https://vikyd.github.io/download-chromium-history-version/ ,可能需要科学上网(dddd),然后在 version 下拉里面选择你要的平台,然后在输入框输入版本号,例如 : windows 64位 113.0版本选择浏览器版本并下载压缩包下载完成后解压即可使用将 chromedriver.exe 保存到任意位置,并把当前路径保存到环境变量中(我的电脑>>右键属性>>高级系统设置>>高级>>环境变量>>系统变量>>Path),添加的时候要注意不要把 path 变量给覆盖了,如果覆盖了千万别关机,然后百度。添加成功后使用下面代码进行测试。# 导入 webdriver import time from selenium import webdriver # 调用环境变量指定的PhantomJS浏览器创建浏览器对象 from selenium.webdriver.common.by import By driver = webdriver.Chrome() # get方法会一直等到页面被完全加载,然后才会继续程序,通常测试会在这里选择 driver.get("https://www.baidu.com/") # id="kw"是百度搜索输入框,输入字符串"长城" driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("长城") # id="su"是百度搜索按钮,click() 是模拟点击 driver.find_element(By.CSS_SELECTOR,"#su").click() time.sleep(20)
0
0
0
浏览量2418
熊Sir

Web的自动化测试工具Selenium

Web的自动化测试工具Selenium
0
0
0
浏览量3990

履历