python--自动化测试--selenium-WebDriver

    xiaoxiao2022-07-12  148

    web自动化测试-------selenium

    引入web自动化测试的目的:通过运行脚本,让程序自动地检测项目代码是否符合需求以及逻辑的正确性前提:项目需求不经常变化,需要进行回归测试等
    目录索引:

    主流工具软件 selenium-WebDriver 元素定位 元素操作 元素等待 下拉框 警告框 滚动条 frame表单切换 多窗口 窗口截图 验证码处理

    主流工具软件

    Web自动化测试:selenium App端自动化测试:Appium、UIautomation 接口自动化测试:Jmeter、Postman 性能测试:Jmeter、LoadRunner
    ^_^注意:Chrome浏览器拖拽使用插件要控制版本在66以下

    selenium-WebDriver

    安装 pip install selenium 谷歌浏览器 selenium2.x/3.x +Chrome驱动

    各个驱动下载地址

    元素定位

    为什么要学习元素定位? 因为自动化测试需要书写脚本,让程序代码自动定位/操作指定元素 WebDriver提供了八种元素定位方式,分别是: 1. id 2. name 3. class_name 4. tag_name 5. link_text 6. partial_link_text 7. Xpath 8. Css
      id定位实现 步骤分析
    #1. 导入selenium包 --> from selenium import webdriver #2. 导入time包 --> from time import sleep #3. 实例化谷歌浏览器 --> """ 初次实例化浏览器步骤需要告知 chromedriver 在Chrome中的路径,如 driver = webdriver.Chrome(r'C:\Program Files (x86)\Google\Chrome\Application\chromedriver') """ driver=webdriver.Chrome() #4.输入本地html文件路径 --> url='xxx' #5.打开注册A.html --> driver.get(url) #6.调用id定位方法 --> driver.find_element_by_id("id名") #7. 使用send_keys()方法发送数据 --> .send_keys("admin") #8. 暂停3秒 --> sleep(3) #9. 关闭浏览器 --> quit() #于是,我们实现了一个简单的 获取标签-->修改标签内容 的功能
     id定位 总结
    1. 导包 2. url中\\转义 3. id定位方法 3. 发送内容方法 4. 暂停方法 5. 关闭浏览器
    (其他元素定位方式参考id定位)
     提示:find_element和find_elements的区别
    find_element 对于find_element()的使用,他需要传入2个参数,查找方式by和值,如find_element_by_id("name"), 但是find_element()只会查找页面中符合条件的第一个节点,并返回 find_elements find_elements查找返回的是一个list列表对象。所以查找多个节点时,应该使用find_elements()更好 但是当只是想要获取标签内的内容时,使用find_element,因为列表对象没有相应的获取方法
     元素定位Xpath
    from selenium import webdriver driver.find_element_by_xpath("Xpath路径")

     Xpath下载地址

    Xpath定位元素的几种方式: 1. 路径-定位 1). 绝对路径 2). 相对路径 2. 利用元素属性-定位 3. 层级与属性结合-定位 4. 属性与逻辑结合-定位 绝对路径:从最外层元素到指定元素之间所有经过元素层级路径 ;如:/html/body/div/p[2] 相对路径:从第一个符合条件元素开始(一般配合属性来区分);如://input[@id='kw'] 元素属性 示例://*[@id='userA'] 层级与属性结合 说明:要找的元素没有属性,但是它的父级有; 示例://*[@id='p1']/input 属性与逻辑结合 说明:解决元素之间个相同属性重名问题 示例://*[@id='telA' and @class='telA'] //*[text()="xxx"] 文本内容是xxx的元素 //*[starts-with(@attribute,'xxx')] 属性以xxx开头的元素 //*[contains(@attribute,'Sxxx')] 属性中含有xxx的元素 最简单的通过Xpath获取方式就是找到元素对应的标签,右键copy---->copy Xpath导出Xpath路径
     元素定位CSS同Xpath
    元素操作
     好了,那么通过元素定位获取了对应的元素,可以通过以下方法对元素进行操作
    元素常用操作方法
    1. clear() 清除文本 2. send_keys() 模拟输入 3. click() 单击元素 #例:清除获取到的元素标签内容 driver.find_element_by_id('').clear()
    WebDriver操作浏览器常用方法
    1. maximize_window() 最大化 --> 模拟浏览器最大化按钮 2. set_window_size(100,100) 浏览器大小 --> 设置浏览器宽、高(像素点) 3. set_window_position(300,200) 浏览器位置 --> 设置浏览器位置 4. back() 后退 --> 模拟浏览器后退按钮 5. forward() 前进 --> 模拟浏览器前进按钮 6. refresh() 刷新 --> 模拟浏览器F5刷新 7. close() 关闭 --> 模拟浏览器关闭按钮(关闭单个窗口) 8. quit() 关闭 --> 关闭所有WebDriver启动的窗口
    WebDriver其他常用方法
    1. size 返回元素大小 2. text 获取元素的文本 3. title 获取页面title 4. current_url 获取当前页面URL 5. get_attribute("xxx") 获取属性值;xxx:要获取的属性 6. is_display() 判断元素是否可见 7. is_enabled() 判断元素是否可用 提示: 1. size、text、title、current_url:为属性,调用时无括号;如:xxx.size 2. title、current_url:使用浏览器实例化对象直接调用; 如: driver.title #例:获取用户名文本框大小 size=driver.find_element_by_id("userA").size print('size:',size) # 获取a标签id=fwA的href属性值 href=driver.find_element_by_id("fwA").get_attribute("href")
    模拟键鼠操作
       WebDriver库将操作鼠标的方法封装在ActionChains类中,对键盘的操作都封装在Keys类中
       鼠标操作
    1. context_click() 右击 --> 此方法模拟鼠标右键点击效果 2. double_click() 双击 --> 此方法模拟双标双击效果 3. drag_and_drop() 拖动 --> 此方法模拟双标拖动效果 4. move_to_element() 悬停 --> 此方法模拟鼠标悬停效果 5. perform() 执行 --> 此方法用来执行以上所有鼠标方法 #例:操作鼠标右键点击:(右键点击出现的菜单栏目前无法继续操作,所以右键的方法了解即可) #1导包 from selenium.webdriver.common.action_chains import ActionChains #2实例化ActionChains对象 Action=ActionChains(driver) #3调用右键方法,点击username对应的元素 element=Action.context_click(username) #4执行 !提示:必须调用perform()方法才能执行鼠标事件! element.perform() """ 3、4合并为: Action.context_click(username).perform() """ #其他方法参照此方法
       键盘操作
    #导包 from selenium.webdriver.common.keys import Keys 1. send_keys(Keys.BACK_SPACE)删除键(BackSpace) 2. send_keys(Keys.SPACE)空格键(Space) 3. send_keys(Keys.TAB)制表键(Tab) 4. send_keys(Keys.ESCAPE)回退键(Esc) 5. send_keys(Keys.ENTER)回车键(Enter) 6. send_keys(Keys.CONTROL,'a') 全选(Ctrl+A) 7. send_keys(Keys.CONTROL,'c')复制(Ctrl+C) # 定位用户名 element=driver.find_element_by_id("userA") # 输入用户名 element.send_keys("admin1") # 删除1 element.send_keys(Keys.BACK_SPACE) # 全选 element.send_keys(Keys.CONTROL,'a') # 复制 element.send_keys(Keys.CONTROL,'c') # 粘贴 driver.find_element_by_id('passwordA').send_keys(Keys.CONTROL,'v') 元素等待 显式等待隐式等待 隐式等待 说明:等待元素加载指定的时长,超出抛出NoSuchElementException异常,实际工作中,一般都使用隐式等待; 显式与隐式区别: 1. 作用域:显式等待为单个元素有效,隐式为全局元素 2. 方法:显式等待方法封装在WebDriverWait类中,而隐式等待则直接通过浏览器实例化对象调用
     隐式等待调用方法
    调用: driver.implicitly_wait(10) (driver:为浏览器实例化对象名称) (10为等待最大时长,单位:秒) 说明: 如果定位某一元素定位失败,那么就会触发隐式等待有效时长,如果在指定时长内加载完毕,则继续执行,否则 抛出NoSuchElementException异常,如果元素在第一次就定位到则不会触发隐式等待时长; 下拉框 下拉框就是HTML中<select>元素,通过option选项的值来定位

    方法:通过select类中的方法: 1. select_by_index() --> 根据option索引来定位,从0开始 2. select_by_value() --> 根据option属性 value值来定位 3. select_by_visible_text() --> 根据option显示文本来定位 代码实现步骤: #导包 from selenium.webdriver.support.select import Select #实例化select select=Select(driver.find_element_by_id('selectA')) #定位方式 select.select_by_index(下标) select.select_by_value('option内标签value值') select.select_by_visible_text('option对应的文本内容,如111111') 警告框 警告框处理办法: 1. text --> 返回alert/confirm/prompt中的文字信息 2. accept() --> 接受对话框选项 3. dismiss() --> 取消对话框选项 实际步骤: #(触发警告框/获取警告框) driver.find_element_by_id("alerta").click() # 获取警告框 alert=driver.switch_to.alert # 打印警告框文本 print(alert.text) # 接受警告框 alert.accept() # 取消警告框 #alert.dismiss() 滚动条
          场景:页面注册同意条款,需要滚动条到最底层,才能点击同意。
          在HTML页面中,页面元素为动态显示,元素根据滚动条的下拉而被加载。
    案例: 案例:打开页面A,2秒后,下拉页面到最底层 import time from selenium import webdriver driver=webdriver.Chrome() url='xxx' driver.get(url) time.sleep(2) js1="window.scrollTo(0,1000)" driver.execute_script(js1) # 最顶层 js2="window.scrollTo(0,0)" frame表单切换
          frame表单切换是什么?
      场景--母页面(A)中有2个内嵌子页面(B)和(C),通过打开母页面A切换到子页面B和C,然后操作B和C中的属性
    方法: 1). driver.switch_to.frame("myframe1") --> 切换表单方法 (myframe1:为frame表单的name或id) 2). driver.switch_to.default_content() --> 恢复默认页面方法 (在frame表单中操作其他页面,必须先回到默认页面,才能进一步操作) 3). driver.switch_to.parent_frame() -->向上的单层切换 操作原理: 1) html中的iframe标签提供了内联结构,使用内联结构可以在一个浏览器窗口显示多个页面。 2) iframe标签是外层页面的标签,若想操作iframe框架内嵌的页面,需要先定位到iframe标签上。 3) 通过switch_to.frame()切换到内层页面,再进行内层页面的操作。 4) 内层页面的操作办法和普通页面的操作办法相同:元素定位、元素操作。 图例

    多窗口

          场景:在打开的A页面新打开B页面,操作B页面中的元素
          方法
    方法: 1). driver.current_window_handle --> 获取当前窗口句柄 2). driver.window_handles --> 获取所有窗口句柄 3). driver.switch_to.window(handle) --> 切换指定句柄窗口

      句柄1

    窗口截图
          frame说明:自动化脚本是由程序去执行的,因此有时候打印的错误信息并不是十分明确。如果在执行出错的时候对当前 窗口截图保存,那么通过图片就可以非常直观地看到出错的原因。
          方法
    方法: 直接调用即可 1). get_screenshot_as_file(imgpath) --> 截取当前窗口 (imgpath:图片保存路径) 验证码处理 验证码处理方式: 1).关闭验证码验证(简单粗暴) 2).设置万能验证码(简单粗暴) 3).记录cookie 4).验证码识别(不推荐) 方法: 1. get_cookie(name) --> 获取指定cookie (name:为健名) 2. get_cookies() --> 获取本网站所有本地cookies 3. add_cookie(str) --> 添加cookie (str:为python中的字典格式) 结束

    句柄:英文handle,窗口的唯一识别码 ↩︎

    最新回复(0)