• [测试] selenium自动化测试


    1.webdriver API

    一个简单自动化脚本的构成:

    打开百度搜索selenium

    1. # coding = utf-8 设置编码模式
    2. from selenium import webdriver # 导入webdriver工具包,这样就可以使用里面的API
    3. import time
    4. browser = webdriver.Firefox() # 获取浏览器(Firefox)驱动
    5. time.sleep(3) # 休息3秒
    6. browser.get("http://www.baidu.com")
    7. time.sleep(3)
    8. browser.find_element_by_id("kw").send_keys("selenium") # 定位元素“kw” 输入selenium
    9. time.sleep(3)
    10. browser.find_element_by_id("su").click() # 定位元素“su” click点击
    11. browser.quit() # 关闭浏览器

    UI测试:界面上进行元素的操作 先定位元素,再去操作元素

    browser.quit() 退出并关闭窗口.清理浏览器的缓存,更好的释放资源

    browser.close() 也可以关闭窗口

    2.定位元素的方式

    定位元素的原则,不管用什么方式定位,这个方式(tag_name,name,id等)必须全局唯一

    1. id 如果存在,可以全局唯一定位一个元素
    2. name 存在并且全局唯一才可以定位到
    3. class name 存在并且全局唯一才可以定位到
    4. link text 必须是链接,且链接内容全局唯一,才可以定位到
    5. partial link text 必须是链接,且链接内容全局唯一,才可以定位到
    6. tag name 必须全局唯一才可以定位到
    7. xpath 任何一个元素都可以定位到
    8. css selector
    1. # 定位元素的方式
    2. from selenium import webdriver
    3. import time
    4. driver = webdriver.Chrome()
    5. driver.get("https://www.baidu.com/")
    6. time.sleep(3)
    7. # # 通过 id 来定位 全局唯一,可以唯一定位一个元素
    8. # # 锁定位置 输入梦华录send_keys("梦华录")
    9. # driver.find_element_by_id("kw").send_keys("梦华录")
    10. # time.sleep(3)
    11. # # 锁定位置 点击click()
    12. # driver.find_element_by_id("su").click()
    13. # # 通过name来定位
    14. # driver.find_element_by_name("wd").send_keys("赵盼儿")
    15. # driver.find_element_by_id("su").click()
    16. # # 通过 tag_name定位
    17. # driver.find_element_by_tag_name("input").send_keys("孙二娘")
    18. # driver.find_element_by_id("input").click()
    19. # # class name定位 全局唯一
    20. # driver.find_element_by_class_name("s_ipt").send_keys("孙二娘")
    21. # driver.find_element_by_id("su").click()
    22. # # link text定位 全局唯一
    23. # driver.find_element_by_link_text("hao123").click()
    24. # # partial link text 全局唯一
    25. # driver.find_element_by_partial_link_text("123").click()
    26. # # xpath 任何元素都可以定位到
    27. # driver.find_element_by_xpath("//*[@id='kw']").send_keys("赵盼儿")
    28. # driver.find_element_by_xpath("//*[@id='su']").click()
    29. # css selector
    30. driver.find_element_by_css_selector("#kw").send_keys("李逍遥")
    31. driver.find_element_by_css_selector("#su").click()
    32. time.sleep(5)
    33. # 关闭浏览器
    34. driver.quit()

    3.操作测试对象

    1. send_keys( ) 向元素发送信息
    2. click( ) 点击元素
    3. submit( ) 提交表单
    4. clear( ) 清除元素的内容
    1. # 操作测试对象
    2. from selenium import webdriver
    3. import time
    4. driver = webdriver.Firefox()
    5. driver.get("https://www.baidu.com/")
    6. time.sleep(3)
    7. # 搜索徐渭熊
    8. driver.find_element_by_css_selector("#kw").send_keys("徐渭熊")
    9. driver.find_element_by_css_selector("#su").submit()
    10. time.sleep(6)
    11. # 清除徐渭熊
    12. driver.find_element_by_id("kw").clear()
    13. time.sleep(5)
    14. driver.find_element_by_id("kw").send_keys("徐骁")
    15. # 提交搜索信息 和click作用一样
    16. driver.find_element_by_id("su").submit()
    17. time.sleep(5)
    18. driver.quit()

        5.text 获取元素的内容

    1. from selenium import webdriver
    2. import time
    3. driver = webdriver.Firefox()
    4. driver.get("https://www.baidu.com/")
    5. time.sleep(3)
    6. # 获取文本信息
    7. text = driver.find_element_by_id("bottom_layer").text
    8. print(text)
    9. time.sleep(5)
    10. driver.quit()

    结果:

    4.等待

    当页面的元素没有加载出来的时候,无法定位到元素,因此等待的存在是非常有必要的

    1. 固定等待 sleep( ) (必须等够括号中的时间)
    2. 隐式等待(智能等待)

    driver.implicitly_wait 等待页面上的元素加载出来后立刻去执行下一个相关指令

    1. from selenium import webdriver
    2. import time
    3. driver = webdriver.Firefox()
    4. driver.get("https://www.baidu.com/")
    5. driver.maximize_window()
    6. driver.find_element_by_id("kw").send_keys("林俊杰")
    7. driver.find_element_by_id("su").click()
    8. # # 固定等待
    9. # time.sleep(5)
    10. # 智能等待
    11. driver.implicitly_wait(5)
    12. driver.find_element_by_link_text("百度百科").click()
    13. time.sleep(6)
    14. driver.quit()

    5.信息打印

    打印 title

    打印URL

    1. from selenium import webdriver
    2. import time
    3. driver = webdriver.Firefox()
    4. driver.get("https://www.baidu.com/")
    5. time.sleep(3)
    6. driver.maximize_window()
    7. title = driver.title
    8. print(title)
    9. url = driver.current_url
    10. print(url)
    11. time.sleep(6)
    12. driver.quit()

    6.对浏览器的操作

    (1)浏览器的最大化

    driver.maximize_window()

    (2)设置浏览器的宽和高

    driver.set_window_size(400,1000)

    (3)浏览器的前进和后退

    后退:driver.back()

    前进:driver.forward()

    (4)浏览器滚动条的控制

    1. # 浏览器滚动条的控制
    2. # 底端
    3. js0 = "var q=document.documentElement.scrollTop=10000"
    4. driver.execute_script(js0)
    5. time.sleep(3)
    6. # 顶端
    7. js1 = "var q=document.documentElement.scrollTop=0"
    8. driver.execute_script(js1)

    7.键盘事件

    所有的键盘操作,必须立在定位到元素的基础上,因为我们是基于元素进行操作

    导入工具包:from selenium.webdriver.common.keys import Keys

    Keys.TAB

    Keys.ENTER

    组合键

    导入工具包:from selenium.webdriver.common.action_chains import ActionChains

    全选 send_keys(Keys.CONTROL,'a')

    剪贴 send_keys(Keys.CONTROL,'x')

    右击和双击(和点击的效果相同)取的前提是先定位元素

    右击 ActionChains(driver).contxt_click(b).perform()

    双击 ActionChains(driver).double_click(b).perform()

    8.定位一组元素

    (1)如何打开本地的HTML页面

    拼成一个URL : file: + /// + 文件绝对路径

    先导包:import os os.path.abspath(文件的绝对路径)

    url = "file:///" + os.path.abspath("E:\\11\\测试文件\\selenium2html/checkbox.html")

    (2)先定位出同一类元素(tag name,name,class name等),然后根据需要定位的元素的特征(type)去甄别出要定位的具体元素进行操作

    1. from selenium import webdriver
    2. import time
    3. import os
    4. driver = webdriver.Chrome()
    5. url = "file:///" + os.path.abspath("E:\\11\\测试文件\\selenium2html/checkbox.html")
    6. driver.get(url)
    7. time.sleep(3)
    8. driver.maximize_window()
    9. # # 勾选里面所有的checkbox
    10. # driver.find_element_by_id("c1").click()
    11. # driver.find_element_by_id("c2").click()
    12. # driver.find_element_by_id("c3").click()
    13. # 定位一组tag name 都为input的元素
    14. buttons = driver.find_elements_by_tag_name("input")
    15. for button in buttons:
    16. if button.get_attribute('type') == 'checkbox':
    17. button.click()
    18. time.sleep(5)
    19. driver.quit()

    9.多层框架的定位

    iframe 框架里面嵌套框架

     

    解决不同层框架上的页面的元素的定位

    driver.switch_to.frame("f1")

    (1)如果要定位一个层级框架中的元素,必须先调到这个框架层级,才可以定位

    (2)如果要定位某一个层级,必须从默认页面跳转

    driver.switch_to.default_content()

    • default content——> f1 (√)
    • f1 ——> f2 (√)
    • default content ——> f2 (×)
    • f2 ——> f1(×)
    1. from selenium import webdriver
    2. import time
    3. import os
    4. driver = webdriver.Chrome()
    5. url = "file:///" + os.path.abspath("C:\\课件\\我的课件\\测试\\selenium2/locateElement/selenium2html/frame.html")
    6. driver.get(url)
    7. time.sleep(3)
    8. driver.maximize_window()
    9. # 从默认页面到 f1 框架页面
    10. driver.switch_to.frame("f1")
    11. driver.find_element_by_link_text("click").click()
    12. # 回到默认页面
    13. driver.switch_to.default_content()
    14. driver.switch_to_frame()
    15. time.sleep(6)
    16. driver.quit()

    10.层级定位

     

    由link1找到Another action 让鼠标定位到Another action

    1. from selenium import webdriver
    2. import time
    3. import os
    4. from selenium.webdriver.common.action_chains import ActionChains
    5. driver = webdriver.Chrome()
    6. url = "file:///"+os.path.abspath("E:\\11\\测试文件\\selenium2html/level_locate.html")
    7. driver.get(url)
    8. driver.maximize_window()
    9. # 定位link1,点击
    10. driver.find_element_by_link_text("Link1").click()
    11. driver.implicitly_wait(10)
    12. # 定位 Another Action
    13. action = driver.find_element_by_link_text("Another action")
    14. # 高亮显示Another action, 把鼠标移动到 Another action上面
    15. ActionChains(driver).move_to_element(action).perform()
    16. time.sleep(6)
    17. driver.quit()

    11.下拉框选择

    (1)直接用xpath定位

    (2)先定位出一组元素(tag name等),然后根据元素的属性进行过滤筛选,再进行具体操作

    (3)先定位出一组元素(tag name等),通过数组下标的方式定位

    1. from selenium import webdriver
    2. import time
    3. import os
    4. from selenium.webdriver.common.action_chains import ActionChains
    5. driver = webdriver.Chrome()
    6. url = "file:///"+os.path.abspath("E:\\11\\测试文件\\selenium2html/drop_down.html")
    7. driver.get(url)
    8. driver.maximize_window()
    9. time.sleep(3)
    10. # # xpath 定位
    11. # driver.find_element_by_xpath("//*[@id='ShippingMethod']/option[3]").click()
    12. options = driver.find_elements_by_tag_name("option")
    13. # 方法1
    14. # for option in options:
    15. # if option.get_attribute('value') == '10.69':
    16. # option.click()
    17. # 方法2
    18. options[2].click()
    19. time.sleep(6)
    20. driver.quit()

    12.alert 弹框处理

    1. # 定位弹出框/获得弹出框的操作句柄
    2. alert = driver.switch_to.alert
    3. # 关闭 alert
    4. alert.accept()

    如果弹框需要输入信息:

    1. # 先获取弹出框的操作句柄
    2. alert = driver.switch_to.alert
    3. # 再用send_keys去输入信息
    4. alert.send_keys("你好世界")

    13.div块的处理

    适用于页面复杂,元素非常多,没有id,并且name或者tag name 重复

    (1)首先要定位元素所在的div模块

    (2)在定位到的div模块的基础上去精确寻找需要定位的元素

    1. # 点击div 框框里面的click me,让弹出框内容发生变化
    2. div1 = driver.find_element_by_class_name("modal-body")
    3. div1.find_element_by_link_text("click me").click()
    4. time.sleep(4)

    14.上传文件

    定位上传按钮

    send_keys(需要上传文件的绝对路径+文件名字)

    driver.find_element_by_name("file").send_keys("C:\\Users\\lingqi\\Pictures/test.jpg")

    15.为什么有些第三方网站的页面元素无法定位

    比如网易邮箱登录时,用 id 进行定位,你每次打开页面或者刷新的时候 id 会变

    为安全性考虑 因此无法定位

    会有人恶意用自动化一直输入账号密码来盗取你的账号

  • 相关阅读:
    Flink学习17:算子介绍flatMap
    学习二十大奋进新征程线上知识答题活动回顾
    在JavaScript中检查一个数字是否是另一个数字的倍数
    JWT登录认证(3拦截器)
    “遥遥领先”已被注册为商标,华为这次真的在行业里遥遥领先
    学生信息管理系统
    中级前端工程师要回的知识
    【Java】Collections.shuffle 洗牌方法,随机重排序一组元素
    VBA技术资料MF68:更改所选区域边框颜色
    【AGC】构建服务3-认证服务示例
  • 原文地址:https://blog.csdn.net/weixin_61567666/article/details/125533451