1.窗口最大最小化
- driver.maximize_window()
- driver.minimize_window()
2.浏览器导航
- driver.back() 在浏览器历史记录中向后导航
- driver.forward() 在浏览器历史记录中向前导航
- driver.refresh() 刷新/重新加载页面
3.切换窗口
- driver.switch_to.frame('login_frame’) 通过id、name、element(定位的某个元素)、索引来切换到某个frame
- driver.switch_to.active_element 定位到当前聚焦的元素上
- driver.switch_to.parent_frame() 切换到上一层页面
- driver.window_handles 获取当前浏览器的所有窗口句柄
- driver.current_window_handle 获取当前窗口的句柄
- driver.switch_to.window(h) 切换浏览器窗口(根据句柄)
- driver.switch_to.window(handles[-1]) 切换到最新打开的窗口
- driver.switch_to.window(handles[-2]) 切换到倒数第二个打开的窗口
- driver.switch_to.window(handles[0]) 切换到最开始打开的窗口
- driver.switch_to.default_content() 切换到最上层页面
- 注意:frame标签有frameset、frame、iframe三种,frameset跟其他普通标签没有区别,不会影响到正常的定位,而frame与iframe需要切换frame之后才能定位。frame需层层切!
4.滚动网页
- 方法1:固定滑动多少像素
- 如果滚动条是针对整个HTML可以用如下方式:
- js = “var q=document.documentElement.scrollTop=10000” # document.documentElement表示获取根节点元素
- driver.execute_script(js)
- 如果滚动条是针对整个body可以用如下方式:
- js = “var q=document.body.scrollTop=10000” # document.body表示获取body节点元素
- driver.execute_script(js)
- 如果滚动条是针对某个div可以用如下方式:该页面的滚动条就是针对class='main’的div而言的
- js = “var q=document.getElementsByClassName(‘main’)[0].scrollTop = 10000” # getElementsByClassName表示获取class='main’的元素列表,0表示第一个,所以使用的时候要加索引。如果是getElementById,则不需要加索引。
- driver.execute_script(js)
- 如果滚动条是针对整个HTML可以用如下方式:
- 方法2:滑动到某个元素的位置 scrollIntoView
- target = driver.find_element_by_xpath(“//b[contains(text(),‘网页’)]”)
- driver.execute_script(“arguments[0].scrollIntoView();”, target)
- 注意:arguments对象是所有函数中都可用的局部变量,可以使用arguments对象在函数中引用函数的参数。此对象包含传递给函数的每个参数,第一个参数在索引0处。例如,如果一个函数传递了三个参数,你可以以如下方式引用他们:arguments[0],arguments[1],arguments[2]
- scrollIntoView是一个与页面(容器)滚动相关的API
- element.scrollIntoView() 参数默认为true
- 参数为true:调用该函数,页面发送滚动,使element的顶部与视图(容器)顶部对齐
- 参数为false:使element的底部与视图(容器)底部对齐
- 方法3:Window.scrollTo()
- scrollTo() 方法可把内容滚动到指定的坐标
- scrollTo(xpos,ypos)
- 参数描述:
- xpos 必需。要在窗口文档显示区左上角显示的文档的 x 坐标。
- ypos 必需。要在窗口文档显示区左上角显示的文档的 y 坐标。
- 获取高度的方法(部分)
- document.documentElement.scrollHeight 浏览器所有内容高度
- document.body.scrollHeight 浏览器所有内容高度
- document.documentElement.scrollTop 浏览器滚动部分高度
- document.body.scrollTop 始终为0
- document.documentElement.clientHeight 浏览器可视部分高度
- document.body.clientHeight 浏览器所有内容高度
- 示例
- #滚动到页面最底部
- driver.execute_script(“window.scrollTo(0,document.body.scrollHeight)”)
- #滚动到页面最顶部
- driver.execute_script(“window.scrollTo(document.body.scrollHeight,0)”)
- scrollTo() 方法可把内容滚动到指定的坐标
5.等待时间
- 强制等待
- time.sleep():设置固定的等待时间,使用方便,只对本行的元素有查找作用,如果在设定的时间内查找到元素,则继续执行下边的代码,如果未在规定的时间内完成加载则抛出异常,需要频繁设置,会延长代码运行时间
- 强制等待使用场景 :页面加载
- 示例:time.sleep(2) 强制等待两秒,需要import time
- 隐式等待
- implicitly_wait():针对全部元素设置的等待时间,我们设置了一个等待时间范围,这个等待的时间是不固定的,最长的等待也莫过于我们设置的最大值,只需要在项目开始时设置一次,全局起效,针对受网络影响,加载缓慢的控件使用不方便
- 隐式等待使用场景 :打开页面后
- 示例:driver.implicitly_wait(10) #这里设置智能等待10s
- 显式等待
- WebDriverWait():针对某个元素来设置的等待时间,在整个页面查找某个元素,如果在设定的时间内间隔时间查找到元素,则继续执行下边的代码,如果未在规定的时间内完成加载则抛出异常,可以设置最长等待时间和查找控件的频率,针对受网络影响,加载缓慢的控件使用方便
- 显示等待使用场景:搜索某个元素时
- 示例:
- WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, “frame_html_setting”)))
- until 也属于WebDriverWait,代表一直等待,直到某元素可见,until_not与其相反,判断某个元素直到不存在
- presence_of_element_located主要判断页面元素frame_html_setting在页面中存在。
- WebDriverWait(driver,10).until_not(EC.presence_of_element_located((By.XPATH, “//a[text()=‘企业邮箱’]”)))
- WebDriverWait(driver,10).until(EC.presence_of_element_located((By.ID, “frame_html_setting”)))
6.截屏
- get_screenshot_as_file()
- driver.get_screenshot_as_file(‘/Users/dengchunmei/PycharmProjects/AutomatedTestingDemo/picture/baidu.png’)
- save_screenshot()
- driver.save_screenshot(‘baidu1.png’)
- 滚动截屏
- 原理:通过滚动页面截取多张+PIL图片拼接的方式实现全屏的截图
- 步骤:
- 全屏窗口以获得最大展示范围,通过get_window_size()获取屏幕高度,通过执行js,获取页面高度。
- 相除后获得滚动次数。
- 每次滚动后,截图保存,然后使用Image打开转换为二维矩阵拼接到上一个图片的二维矩阵中。
- 循环完,最后再将拼接的二维矩阵输出成图片。
- 前提:需要安装PIL和numpy: pip3 install pillow,pip3 install Numpy
- 代码:
from PIL import Image
import numpy as np
window_height = driver.get_window_size()['height'] # 窗口高度
page_height = driver.execute_script('return document.documentElement.scrollHeight') # 页面高度
driver.save_screenshot('baidu.png')
if page_height > window_height:
n = page_height // window_height # 需要滚动的次数
base_mat = np.atleast_2d(Image.open('baidu.png')) # 打开截图并转为二维矩阵
for i in range(n):
driver.execute_script(f'document.documentElement.scrollTop={
window_height * (i + 1)};')
time.sleep(5)
driver.save_screenshot(f'baidu_{
i}.png') # 保存截图(全页面)
mat = np.atleast_2d(Image.open(f'baidu_{
i}.png')) # 打开截图并转为二维矩阵
base_mat = np.append(base_mat, mat, axis=0) # 拼接图片的二维矩阵
Image.fromarray(base_mat).save('baidu123.png')
7.更改元素属性
(当日期选择控件是input标签且为只读的时候,就可以去掉readonly,然后再赋值)
- 设置readonly属性
- js = “document.getElementById(‘kw’).readOnly=true”
- driver.execute_script(js)
- 去掉readonly属性
- js=‘document.getElementById(“kw”).removeAttribute(“readonly”)’
- driver.execute_script(js)