三、浅谈 Selenium
1.Selenium 简介:
Selenium 是一款免费的、开源的、基于 Web 页面的 UI 自动化测试工具,可以支持多个浏览器。
2.Selenium 框架由多个工具组成:Selenium IDE、Selenium RC、Selenium WebDriver、Selenium Grid
(2.1)Selenium IDE:通过录制操作完成基本脚本构建的工具;
(2.2)Selenium RC
(2.3)Selenium WebDriver:可以直接发命令给浏览器
(2.4)Selenium Grid:用于运行不同的机器,不用的浏览器进行并行测试,目的就是加快测试用例的运行速度,从而减少测试运行的总时间。
3. Selenium 的基本元素定位:
(1)id定位:id 属性在 HTML 中是唯一的,类似于元素身份证号码,driver.find_element_by_id("id")
(2)name定位:识别首个 name 属性等于定位值的页面元素,driver.find_element_by_name("name")
(3)class_name定位:class 属性在页面中不是唯一的,driver.find_element_by_clss_name("class")
(4)tag_name定位:driver.find_element_by_tag_name("tag_name")
(5)link_text定位:定位文本链接,driver.find_element_by_link_text("link_text")
(6)partial_link_text:提取部分文本链接定位,driver.find_element_by_partial_link_text("部分文本")
(7)xpath 定位:
两种方式:绝对路径定位、相对路径定位
相对路径:表示相对当前标签而言的路径结构
(1)属性定位语法://标签名[@属性名=属性值]
(2)多属性定位://标签名[@name='username' and @pwd='password']
(3)函数定位:
text 函数定位语法://标签名[text()=文本内容]
contains函数定位语法://标签名[contains(@属性名, 对应属性值)]
(8)css定位:通过选择器定位
(9)JS定位:常用的定位方式总结:
id定位:document.getElementById()
name定位:document.getElementByName()
tag定位:document.getElementByTagName()
class定位:document.getElementByClassName()
css定位:document.querySelectorAll()
举例:js = "document.getElementById("id")"
driver.execute_script(js)
4.隐藏元素如何定位?
首先隐藏元素是可以定位的,只是隐藏元素无法进行操作。
解决方法:通过 JS 脚本定位到该元素,获取对应的元素对象,然后通过 removeAttribute 和 setAttribute 两个方法完成属性的删除或者重新赋值操作,使当前属性处于显示状态。
5.selenium对浏览器操作:
(1)浏览器前进操作:
forward():在初始操作时,不存在前进操作,一般与back配合使用;
back():后退操作
(2)浏览器的最大化、最小化、全屏
窗口最大化:driver.maximize_window()
窗口最小化:driver.minimize_window()
窗口全屏:driver.fullscreen_window()
(3)浏览器 close 和 quit 方法的区别:
driver.close():关闭当前对象所处页面的窗口
driver.quit():关闭所有的页面窗口并关闭驱动器
(4)浏览器的相关属性获取
获取当前对象的 url 地址:driver.current_url
获取当前对象的句柄:driver.current_window_handle
获取当前对象的标题:driver.title
获取当前对象的所有句柄:driver.window_handles
(5)浏览器操作:driver.switch_to_window(句柄名)
(6)浏览器中 alert 框处理:
alert 框是无法直接进行元素定位的,需要使用 driver.switch_to.alert 先切换到 alert 对象中,然后调用对应的方法执行。
accept():表示确定,dismiss():表示取消
(7)浏览器的滚动条操作:
浏览器滚动条无法直接进行定位,所以需要借助 JS 脚本完成操作。
driver.execute_script("window.scrollTo(0, 100)"):x 表示横向滚动,y表示纵向滚动
(8)driver.get_attribute(name):获取属性值
6.下拉列表框的定位方式:
WebDriver 内置了一个 Select 模块,用于实现下拉列表框的处理操作。
from selenium.webdriver.support.select import Select
定位方法:
(1)select_by_index():通过索引定位(从 0 开始)
(2)select_by_value():通过 value 值定位
(3)select_by_visible_text():通过选项的文本值定位
7. 三种元素等待方式:
(1)强制等待:time.sleep(x),表示等待 x 秒后,进行下一步操作。强制等待又称为强制休眠,该方式只能够作用于当前行的脚本。
缺点:影响代码的执行速度,不能精确设定代码的休眠时间,时间过长则一定要等待设定的时间之后才能继续执行代码。
优点:使用简单,可以在调试时使用
(2)隐式等待:driver.implicitly_wait(x):在 x 时间内页面加载完成,进行下一步操作。隐式等待又称为智能等待,也称为全局等待。表示整个页面中的所有元素加载完才会执行,会根据其内部所设定到的频率不断地刷新页面继续记载,并检测当前所执行的元素是否加载完毕。
缺点:使用隐式等待,程序会一直等待整个页面加载完成,才会执行下一步操作。但有时页面想要的元素已经加载完成了,但网页上个别元素没有加载完成,仍要等到页面全部加载才能执行下一步,使用也不是很灵活。
优点:隐式等待对整个脚本的生命周期都起作用,所以只要设置一次即可。
(3)显式等待:WebDriverWait,对单个元素设定一定的频率,使其按频率刷新当前页面并检测是否存在该元素。
from selenium.webdriver.support.wait import WebDriverWait
WebDriverWait(driver, 5).until(lambda dir: dir.find_element_by_id("value"))
8.验证码的处理方式:
(1)去掉验证码:将验证码相关代码注释掉
(2)设置万能验证码:让开发人眼在程序中声明一个万能验证码
(3)只保留一个资源:如果是图片资源,实际就是在指定的文件夹资源库中随机抽取一张,将服务器上的所有图片全部删除只留一张,相当于固定验证码
(4)光学字符识别:使用 python-tesseract 模块来识别图片中的验证码
(5)打码平台识别:如斐斐、图鉴等,调用第三方接口识别