一、selenium
selenium是一个用于Web应用程序测试的工具。Selenium测试直接运行在浏览器中,就像真正的用户在操作一样。支持的浏览器包括IE(7, 8, 9, 10, 11),Mozilla Firefox,Safari,Google Chrome,Opera,Edge等。这个工具的主要功能包括:测试与浏览器的兼容性——测试应用程序看是否能够很好得工作在不同浏览器和操作系统之上。测试系统功能——创建回归测试检验软件功能和用户需求。支持自动录制动作和自动生成.Net、Java、Per、Pythonl等不同语言的测试脚本。
这里只针对python来使用selenium
二. 使用
1. 下载驱动
测试浏览器需要下载对应浏览器对应的版本
浏览器一般在设置-关于xx浏览器中可看到具体版本号,记住下载需要
chrome浏览器:http://chromedriver.storage.googleapis.com/index.html
firefox浏览器:https://github.com/mozilla/geckodriver/releases
ie浏览器:http://selenium-release.storage.googleapis.com/index.html
Edge浏览器:https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/
Opera浏览器:https://github.com/operasoftware/operachromiumdriver/releases
下载后将其解压到python目录下,或者配置其环境变量
2. python下载selenium
pip install selenium
3. selenium方法
1.1 打开浏览器
from time import sleep
from selenium import webdriver
# executable_path 传驱动的安装路径,# 如果没有将其放到python目录下或配置环境变量则需要加入该参数
driver=webdriver.Chrome(executable_path="D:\\XXX\\XXX\\chromedriver.exe")# 打开浏览器 传入网址
driver.get("https://www.baidu.com")
sleep(1)
driver.get("https://www.csdn.net")
sleep(2)# 后退
driver.back()
sleep(2)# 前进
driver.forward()
sleep(1)# 刷新页面
driver.refresh()
sleep(1)# 浏览器窗口最大化
driver.maximize_window()
sleep(2)# 关闭浏览器当前窗口
driver.close()# 退出浏览器
driver.quit()
1.2 元素定位
需要导入
from selenium.webdriver.common.by import By
从selenium 4.0版本开始弃用find_elements_by_id/name/xpath等等方法,
改为使用find_elements(by=By.ID, value=None),需要导入模块
from selenium.webdriver.common.by import By
注:
find_elements() return list webelement
加s返回的结果类型为list
find_element() return webelement
不加s返回定位到的第一个元素
id定位
id 为element属性中唯一的,值为全局唯一
result = driver.find_elements(By.ID,"app")
name定位
与id属性一致,值唯一
result_2 = driver.find_element(By.NAME,"keywords").get_attribute("content")
result_2 >> CSDN博客,CSDN学院,CSDN论坛,CSDN直播
class_name定位
element元素中的class属性,如果该元素上没id或name可以通过class_name
result = driver.find_element(By.CLASS_NAME,"blog-nav-box").get_attribute("class")
result >> blog-nav-box
tag_name定位
element的标签名,每个元素都有对应的标签名,每个标签名都有其对应功能,在同一个页面中相同的标签名会出现多次,详情请参考HTML标签https://www.runoob.com/tags/html-reference.html
result = driver.find_elements(By.TAG_NAME,"div")#返回多个结果,list类型
xpath定位
XPath 使用路径表达式来选取 XML 文档中的节点或者节点集,当然也适用于HTML
语法参考:https://www.runoob.com/xpath/xpath-syntax.html
也可以通过复制语法,选择需要定位的标签,右键找的复制

定位该元素
result = driver.find_element(By.XPATH,'//div[@class="headswiper"][1]/div[@class="headswiper-content"][ 1]/div/div[1]/a[1]/strong[1]').text
# .text 获取该元素的文本属性
result >> Meta的AI顶尖人才都不干了?
css_selector定位
CSS选择器用于选择你想要的元素的样式的模式。
参考链接https://www.w3school.com.cn/cssref/css_selectors.asp
result_2 = driver.find_element(By.CSS_SELECTOR,'.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong').text
result_2 >> Meta的AI顶尖人才都不干了?
link_text定位
根据标签中含有超链接的文本定位
result = driver.find_element(By.LINK_TEXT,"数据结构与算法").text
result >> 数据结构与算法
partial_link_text定位
根据超链接的文本定位,支持模糊匹配
result = driver.find_element(By.PARTIAL_LINK_TEXT,"数据结构")
result >> 数据结构与算法
1.3 模拟鼠标操作
ActionChains 能够通过代码实现鼠标的单击、双击、右键等待操作
需要导入该包
from selenium.webdriver.common.action_chains import ActionChains
selenium鼠标的操作方法很多,这里只展示单击、双击、右键这三个操作
调用某个方法,还需调用
perform()
方法才可执行操作
单击 click(on_element=None)
# 点击链接跳转网页
result = driver.find_element(By.PARTIAL_LINK_TEXT,"数据结构")
ActionChains(driver).click(result).perform()
sleep(2)
双击 double_click()
通过定位元素,进行翻页操作
result_2 = driver.find_element(By.CSS_SELECTOR,'#floor-www-index_558 > div > div.www-home-content.active > div.headlines > div.headlines-right > div:nth-child(1) > div.headswiper-top > p > img:nth-child(2)')
ActionChains(driver).double_click(result_2).perform()
右键 context_click()
相当于鼠标的右键操作,
接下来模拟鼠标右键打开新标签页,因为需要使用右键中的菜单栏选项,selenium实现不了,python引用一个第三方库
pyautogui
可通过pip安装
pip install pyautogui
result = driver.find_element(By.CSS_SELECTOR,'.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong')
ActionChains(driver).context_click(result).perform()
sleep(2)
pyautogui.typewrite(["down"])
sleep(2)
pyautogui.typewrite(['enter'])
sleep(2)
其他的方法就不一一列举了,这里给列出来
方法描述click(on_element=None)单击鼠标左键click_and_hold(on_element=None)单击鼠标左键,不松开context_click(on_element=None)单击鼠标右键double_click(on_element=None)双击鼠标左键drag_and_drop(soure, target)拖动到某个元素然后松开drag_and_drop_by_offset(soure,xoffset, yoffset)拖动到某个坐标然后松开key_down(value, element=None)按下某个键盘上的键key_up(value, element=None)松开某个键move_by_offset(xoffset, yoffset)鼠标指针从当前位置移动到某个坐标move_to_element(to_element)鼠标指针移动到某个元素move_to_element_with_offset(to_element,xoffset,yoffset)移动到距某个元素(左上角坐标)多少距离的位置perform()执行链中的所有动作release(on_element=None)在某个元素位置松开鼠标左键send_keys(*keys_to_send)发送某个键到当前焦点的元素send_keys_to_element(element,*keys_to_send)发生某个键到指定的元素
1.4 模拟键盘操作
需要使用键盘操作同意需要导入模块
from selenium.webdriver.common.action_chains import ActionChains
定位到某个元素后使用
send_keys(str>需要输入的值 or Keys.xxx>需要操作键盘的键)
进行键盘操作,或者使用鼠标操作移动到某个元素再进行键盘操作,可使用组合键,再后面接着键盘操作,下面总结一些常见键,跟多请查看官网或源码
ActionChains(driver).click(result).send_keys(“数据结构”).send_keys(Keys.ENTER).perform()
方法描述方法描述Keys.ENTER回车键Keys.CONTROL,“x”剪切(ctrl+X)Keys.BACK_SPACE删除键Keys.CONTROL,“v”剪切(ctrl+V)Keys.SPACE空格键send_keys(Keys.F1)F1 键Keys.TABTAB键send_keys(Keys.F2)F2 键Keys.ESCAPE回退键send_keys(Keys.F3)F3 键Keys.F5刷新键send_keys(Keys.F4)F4 键Keys.SHIFTShift键send_keys(Keys.F5)F5 键Keys.ESCAPEESC键send_keys(Keys.F6)F6 键Keys.ARROW_UP上键send_keys(Keys.F7)F7 键Keys.ARROW_DOWN下键send_keys(Keys.F8)F8 键Keys.ARROW_LEFT左键send_keys(Keys.F9)F9 键Keys.RIGHT右键send_keys(Keys.F10)F10 键EQUALS= 键send_keys(Keys.F11)F11 键Keys.CONTROL,“a”全选(ctrl+A)send_keys(Keys.F12)F12 键Keys.CONTROL,“c”复制(ctrl+C)––
1.5 时间等待处理
执行脚本的速度很快,往往没有看到中间情况就已经结束了,接下来使用几个方法来等待时间或等待前面的执行完再执行
WebDriverWait() 显式等待
显示等待是只要条件成立,立即执行后续代码,如果没有满足条件,就会始终在这里等待条件成立,时间超出依然找不到,就抛出异常
from selenium.webdriver.support.ui import WebDriverWait
WebDriverWait(driver,timeout,poll_frequency=0.5,ignored_exceptions=None)
driver: webdrive驱动程序
timeout: 最长等待时间,单位 s 秒
poll_frequency:休眠时间间隔(步长)时间, default 0.5
ignored_exceptions:超时后的异常信息,default>NoSuchElementException
.until(method,message='') 调用该方法提供的驱动程序作为一个参数,直到返回值不为False.until_not(method,message='') 调用该方法提供的驱动程序作为一个参数,直到返回值为False
element = WebDriverWait(driver,10).until(lambda x: x.find_element(By.ID,"app"))
is_disappeared = WebDriverWait(driver,10,1, ElementNotVisibleException).until_not(lambda x: x.find_element(By.ID,"app").is_displayed())
time.sleep() 强制等待
强制让程序暂停一段时间,时间到了才能继续运行。但是不智能,时间设置过短,某些元素还没有加载出来,则会报错。时间过长,浪费时间。
from time import sleep
sleep(2)
implicitly_wait 隐式等待
隐式等待,就是在创建driver时,为浏览器对象创建一个等待时间,这个方法是得不到某个元素就等待一段时间,直到拿到某个元素位置。
默认参数的单位为妙,本例中设置等待时长为10秒,首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位是,如果元素可以定位,则继续执行,如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第六秒定位到了元素则继续执行,若直到超出设置的时长10秒还没有定位到元素,则抛出异常。
driver.implicitly_wait(2)
1.6 窗口切换
获取句柄,得到的是一个列表
handle = driver.windows_handles
切换窗口 切换到最后一个窗口
driver.swith_to_windows(handle[-1])
获取当前窗口
driver.current_window_handle()
1.7 删除某个元素的属性
比如点击超链接会跳转到一个新窗口,那么又需要切换窗口,而只需要修改该元素的一个
target
属性即可。
_blank在新窗口中打开被链接文档_self默认 在相同的框架中打开被链接文档。_parent在父框架集中打开被链接文档_top在整个窗口中打开被链接文档framename在指定的框架中打开被链接文档
使用:首先点位到元素,然后使用可以使用
JS
语法执行操作。执行
JS
的方法`driver.execute_srcipt(“js_syntax”)。
# js对属性的操作方法# 给title属性赋值
js='document.getElementById("nice").setAttribute("title","测试title")'# 删除title属性
js='document.getElementById("nice").removeAttribute("title")'# 获取title属性的值
js='return document.getElementById("nice").getAttribute("title")'# 修改title属性的值
js='document.getELementById("nice").title="测试"'# 前面是使用id定位,使用class_name定位因为会有多个class值相同,所有返回的为list,并且使用的是getElementsByClassName(),加`s`复数形式,取值为索引即可# 方法一 定位 > js修改其属性
result = driver.find_element(By.CSS_SELECTOR,'.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong')# arguments[0]对应的是第一个参数,可以理解为python里的%s传参,与之类似。'.target'表示修改元素的target属性的值# 1.1
driver.execute_script('arguments[0].target="_self"', result)# 1.2
driver.execute_script('arguments[0].setAttribute("target", "_self")', result)# 方法二 js_syntax > execute_script
js_syntax ='document.getElementsByClassName("title")[0].setAttribute("target","_self")'
driver.execute_script(js_syntax)# 获取属性值
js_syntax_2 ='return document.getElementsByClassName("title")[0].getAttribute("target")'
result_2 = driver.execute_script(js_syntax_2)print(result_2)# 测试
result = driver.find_element(By.CSS_SELECTOR,'.headlines-right .headswiper:first-child div:nth-child(2) div div:first-child a.title strong').click()
1.8 submit() 提交表单
selenium 中点击的有click() 但只是点击,不能提交表单数据与后端交互,所有还有一个submit() 方法,提交表单
# 定位登陆
driver.find_element('class name','login-button').click()# 定位输入账户框 输入账户
driver.find_element('id','login-account-name').send_keys('username')# 定位输入密码框 输入密码
driver.find_element('id','login-account-password').send_keys('password')# 点击登陆 注:需要该登陆元素属性中type=‘submit’才可使用submit,否则报错
driver.find_element('id','login-button').submit()
1.9 下拉滚动条
可通过
js
进行滚动,也可使用键进行操作
# 1. js_syntax
js =''window.scrollTo(0,10000)
js_2 ='document.documentElement.scrollTop=100000'
js_3 ='document.documentElement.scrollLeft=100000'# 0:左边距 ---->水平滚动条(下方滚动条)# 10000:上边距------->垂直滚动条(一般为右边滚动条)# 0 为最左/上边,数字大则往右/下边滑动
driver.execute_script(js)# 2. keys# Keys.PAGE_DOWN 往下翻页 Keys.PAGE_UP 往上翻页
driver.find_element('tag name','body').send_keys(Keys.PAGE_DOWN)
1.10 下拉框处理
对
<select></select>
标签处理,需要导入模块。接下来换一个网址进行测试练习.首先切换到内置网页,再定位select标签,使用Select选择
driver.get('https://www.w3school.com.cn/tiy/t.asp?f=eg_html_select')# switch_to.frame("id | name | element") 切换内置网页
driver.switch_to.frame("iframeResult")
select_el = driver.find_element('css selector','html select')
sleep(1)
Select(select_el).select_by_value('opel')
sleep(2)
方法描述select_by_index()通过索引定位(0开始)select_by_value()通过标签value属性的值定位select_by_visible_text()通过文本值定位deselect_all()取消所有选项deselect_by_index()取消对应index选项deselect_by_value()取消对应value选项deselect_by_visible_text()取消对应文本值选项first_selected_option()放回第一个选项all_selected_options()放回所有选项
1.11 文件上传处理
使用selenium上传文件只需要定位到上传文件的标签,然后使用
send_Keys()
输入本地路径。
driver.find_element('name','file').send_Keys(r"D:\\xxx\xxx\xxx.png")
1.12 页面截图
driver.get_screenshot_as_file(filename)
driver.get_screenshot_as_file(r"D:\\xxx\xxx\xxx.png)
1.13 alert对话框处理
在进行某些操作时可能会弹出alert(警告框)对话框,不进行处理的话就不能继续下面的操作,并且无法通过定位的方式定位到。
alert分为三种情况:
警告框:只有一个“确定”的按钮
确认对话框:会询问你一个问题,需要选择“确定”or“取消”
提示对话框:提供一个文本输入框,需要输入对应所需的字段,然后点击“确定”or“取消”。
# 切换到对话框
element = driver.switch_to_alert()# 点击确定
element.accept()# 点击取消
element.dismiss()# 输入值
element.send_Keys("hello")
版权归原作者 sirLateautumn 所有, 如有侵权,请联系我们删除。