文章目录
1.web自动测试工具-Selenium
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-8lPqdrfQ-1673076353851)(D:\test_product\ui_auto\README.assets\image-20220105191213298.png)]
-
组成
1. selenium ide 录制脚本 2. selenium grid 大量的脚本, 分布式执行 3. selenium webdriver 核心, 模拟浏览器手工的操作 ------- selenium 4 selenium 3(为主)
-
Selenium(需要操作)
pip install selenium==3.141.0 # 安装版本 pip install selenium # 默认安装 4 https://pypi.org/ ---- 查看 是否安装 pip list pip show selenium
-
浏览器及其驱动
selenium 操作的是浏览器,想要使用 selenium 去操作浏览器,还需要 安装浏览器对应的驱动才可以. 每个浏览器都有自己对应的驱动程序.
-
谷歌浏览器
谷歌浏览器的版本和驱动要进行对应(大版本对应即可)
-
确认浏览器的版本
-
下载对应版本的驱动
https://npm.taobao.org/mirrors/chromedriver/
-
将驱动进行解压并将其添加到 path 环境变量中
简单的方式: 将 解压之后的驱动 放到 Python 所在的安装目录中(本质添加到 path 环境变量中) ------------------------ 将 驱动放在代码目录中,在代码中指定驱动的路径
-
-
元素定位
1. 常用方法
方法名 | 说明 | |
---|---|---|
ID定位 | driver.find_element(By.ID,"id属性值“) | 使用 标签的ID 属性来定位页面标签. |
Name定位 | driver.find_element(By.NAME,"name属性值“) | 使用标签的 name 属性 来定位. |
Class_Name定位 | driver.find_element(By.CLASS_NAME,"name属性值“) | 使用 标签的 class(类) 属性 来定位元素. |
Tag_name定位 | driver.find_element(By.TAG_NAME,"标签名") | 使用标签的 名字来定位. |
link_text定位 | driver.find_element(By.LINK_TEXT,"a标签的全部文本内容") | 1. 只能用于 超链接标签(a 标签) 2. 根据 a 标签的全部文本内容来定位的(标签中 包含的内容) |
partial_link_text定位 | driver.find_element(By.By.PARTIAL_LINK_TEXT,"a标签的全部文本内容") | 1. 只能用于 超链接标签(a 标签) 2. 根据 a 标签的部分文本内容来定位的(标签中 包含的内容) |
定义一组数据 | driver.find_elementS(By.By.xxx,“xxx”) | 得到的是列表, 即使没有找到元素, 返回的也是 空列表. 可以使用 索引(下标) 来获取指定位置的元素 |
2. XPATH定位
方法 | 使用 |
---|---|
路径定位 | |
属性定位 | '//*[@属性名=“属性值”]' |
属性和逻辑定位 | '//*[@属性名="属性值" and @属性名=”属性值"]' |
文本 | 1. 完整的文本内容:'//*[text()="文本内容"]' 2. 使用部分本内容 '//*[contains(text(),"部分文本内容")]' 3. 3.使用部分属性值 //*[contains(@属性名,'部分属性值')] |
3.CSS定位
使用 | 说明 | |
---|---|---|
ID选择器 | #id属性值 | 使用标签的 ID 属性来定位 |
类选择器 | .类属性值 | 使用标签的 class 属性 来定位 |
元素(标签)选择器 | 标签名 | 使用标签的名字 来定位 |
属性选择器 | [属性值="属性名"] | 使用标签的任意属性 来定位 |
层级选择器 | 1. 父子关系:选择器1> 选择器2 2. 后代:选择器1 选择器2 | |
局部属性选择器 | [属性名*="部分属性值"] | 等价于XPATH中//*[contains(@属性名, "部分属性值")] |
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MHKCdRD7-1673076353852)(D:\test_product\ui_auto\README.assets\image-20230105235549033.png)]
常用界面交互操作
元素操作
1. 元素点击
element.click()
2. 输入
element.send_keys(内容)
3. 清除
element.clear()
元素信息获取
大小/文本/属性
1.获取元素大小
element.size
2.获取元素文本
element.text
3.获取元素属性值
4.element.get_attribute('属性名')
判断元素是否可见
element.is_displayed()
可见 : True
不可见: False
判断元素是否可用
简单的理解,可以认为是是否可以点击
element.is_enabled()
可用: True
不可用: False
判断元素是否被选中
element.is_selected()
选中: True
未选中: False
浏览器常见操作
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-p4yTxFjg-1673076353854)(D:\test_product\ui_auto\README.assets\image-20230106001920941.png)]
关闭窗口/关闭浏览器
1. 关闭当前窗口
driver.close() 关闭当前窗口
2. 关闭浏览器
driver.quit() 不管有多少个打开的窗口,都会直接关闭退出
获取标题/url
作为页面断言的内容使用
1. 标题
driver.title
2. URL
driver.current_url
使用 selenium 操作,打开超链接,如果在新窗口打开, 在我们看来,页面进行了切换,但是对于浏览器来说,是没有切换的,还在原来的页面.
页面交互操作
下拉框
如果是select下拉框,可使用
1. 创建select对象
对象= Select(元素对象)
2. 通过对象选择下拉框中的内容即可
- 对象.select_by_index(index) 根据索引选择,从0开始
- 对象.select_by_value(index) 根据value属性值选择
— 对象.select_by_visible_text(text) 根据文本内容选择
弹出框
-
弹出框分为自定义弹出框 和 JS 弹出
-
区分方式: 根据是否可以右键检查元素来区分, 如果可以检查元素, 就是自定义弹出框, 如果不能检查元素,就是 JS 弹出框
-
自定义弹出框的处理方式: 直接元素定位解决
-
JS 弹出框的处理(alert(警告框)、confirm(确认框)、 prompt(提示框)), 这三种 JS 弹出框的处理方案是一样的.
1. 获取弹出框对象 对象 = driver.switch_to.alert 2. 对弹出框进行处理 - 确认:对象.accept() - 取消:对象.dismiss() - 其他他操作: 获取弹出框的内容 对象.text - prompt 提示框,输入内容,使用的也是 send_keys(), 页面中可能不显示的,但是输入成功的
滚动条
1. selenium 没有提供 直接操作滚动条的方法
2. JS(javascript) 是可以 操作滚动条
js = "window.scrollTo(x,y)"
3. selenium 提供的操作 JS 代码的方法
driver.execute_script(js)
页面元素特殊操作
鼠标操作
1. 实例化鼠标对象
mouse = ActionChains(driver)
2. 书写要进行的鼠标操作
mouse.操作()
- move_to_element(元素对象) 鼠标悬停
- context_click(元素对象) 鼠标右击
- double_click(元素对象) 鼠标双击(选中)
- drag_and_drop(开始, 结束) 拖拽
3. 执行鼠标动作(必须有执行)
mouse.perform()
其他重要API
元素等待
隐形等待
driver.implicitly_wait(最大等待时间) # 单位 秒
1. 定位元素时,如果找到,不触发等待,直接使用
2. 如果没有找到, 间隔一段时间后, 再次定位
3. 达到最大时间,还没找到, 抛出异常 NoSuchElementException
4. 针对所有元素
显示等待
WebDriverWait(driver, 最大等待时间, 间隔时间).until(lambda x: x.find_element(By.xxx, 'xx'))
1. 定位元素时,如果找到,不触发等待,直接使用
2. 如果没有找到, 间隔一段时间后, 再次定位
3. 达到最大时间,还没找到, 抛出异常 TimeoutException
4. 针对单个元素
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-uMaPNyQA-1673076353856)(D:\test_product\ui_auto\README.assets\image-20220624110005247.png)]
强制等待
time.sleep()
frame切换
1. frame 是前端的一种技术框架, 是用来在一个 HTML 页面中,嵌套另一个 HTML 页面的
2. 特点: 如果页面存在 frame,则元素定位的时候, 默认不能定位到 frame 嵌套的页面中(frame 切换)
3. 前端 frame 的实现有两种, frameset , iframe
方法
1. 切换到指定的 frame 页面
driver.switch_to.frame(frame_reference)
- frame_reference: frame 元素对象; ID属性,name 属性,索引
2. 切换到默认的页面
driver.switch_to.default_content()
窗口切换
在浏览器 中通过 selenium 新打开一个窗口,在代码 不会进行切换,即不能操作新打开的窗口页面. 想要操作必须进行窗口切换.
1. 每个窗口都有一个唯一的识别码,称为窗口句柄 handle
2. 获取所有的窗口句柄
driver.window_handles # 得到是的列表, 新打开的窗口句柄会在列表的尾部
3. 切换到指定的窗口
driver.switch_to.window(窗口句柄)
切换到新打开的窗口
driver.switch_to.window(driver.window_handles[-1])
窗口截图
driver.get_screenshot_as_file(图片的路径)
1. 图片的格式 使用 png
2. 如果路径包含目录,目录必须存在