09_常用的方法

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)
  • 方法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)”)

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()=‘企业邮箱’]”)))

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)

猜你喜欢

转载自blog.csdn.net/dcm1324659876/article/details/132366474