• [Python]Selenium-自动化测试


    Selenium是一个web自动化测试的工具,在使用之前先在对应的项目添加工具包噢.

    本文章主要简单的介绍了selenium对于自动化测试的使用 

    目录

    添加浏览器驱动

    get函数来到对应网站

    驱动的定位 

    元素定位

    id定位

    class name定位

    CSS定位

    XPath定位

    link text定位

    定位一组元素

    层级定位

    操作测试对象

    等待

    强制等待

    显式等待

    隐式等待

    鼠标点击与键盘的输入

    send_keys()

    click()

    submit()

    text

    打印信息

    浏览器的操作

    浏览器最大化

    浏览器的宽与高

    浏览器的前进与后退

    键盘按键

    常用按键方法

    键盘组合键用法

    鼠标事件

    alert,conirm,prompt的处理

    上传文件的操作

    selenium简单使用流程


    添加浏览器驱动

    1. from selenium import webdriver #导包
    2. browser = webdriver.Edge() #得到浏览器驱动

    get函数来到对应网站

    browser.get("https://www.baidu.com/index.htm")

    驱动的定位 

    通俗的说,页面通过句柄进行定位,句柄是页面的唯一标识

    可以通过

    driver.window_handles

    来获取所有的句柄,也可以通过下面的方法获取最新页面的句柄 

    driver.switch_to.window(driver.current_window_handle)  #获取当前页面的句柄,并将驱动重新定位到最新的页面

    在获取后,通过switch_to.window方法重新定位浏览器驱动,这样才能进行后续的操作. 

    元素定位

    首先要进行导包

    from selenium.webdriver.common.by import By

    定位元素的方法有很多:

      • id定位(通常是唯一)
      • name定位(允许重复,定位到第一个)
      • tag name(标签名,允许重复定位到第一个)
      • class name定位()
      • CSS定位
      • XPath定位
      • link text定位

    关键是"定位",当然是要定位到一个唯一的地址,当以上的id,name,class name在页面上不是唯一的时候,定位都会失败.

    (可以在浏览器的开发者模式F12中,按下ctrl + f.输入要定位的元素的id或classname进行查看是否唯一)

    图中显示有72个元素包含有container

    id定位

    通过元素的id进行定位

    browser.find_element(By.ID, "kw")

    name,tag name,class name都是与id定位一样的,但都是在唯一的前提下才能进行使用.

    class name定位

    class我们可以只截取其一部分进行定位,如果一个元素的class为hello world

    那么我们可以只把hello或world放上语句进行定位

    CSS定位

    在F12下,找到对应的元素.右键

    选择slector,得到当前元素的CSS

    browser.find_element(By.CSS_SELECTOR, "#kw")

    XPath定位

    与CSS类似的

    browser.find_element(By.XPATH, "//*[@id='kw']")

    link text定位

    像以上的文字链接,就可以使用这种方式(页面唯一时)

    browser.find_element(By.LINK_TEXT,"hao123").click()

    定位一组元素

    使用find_elements

    可以找到多个元素,并以集合的形式存储

    1. saveH3 = driver.find_elements(By.CLASS_NAME, "t") # 获取所有的t
    2. for a in saveH3: # 遍历t中的a,获取文本并打印
    3. data = a.find_element(By.TAG_NAME,"a").text
    4. print(data)

    层级定位

    在定位复杂一点的元素时,可以先定位到其父级元素,并再次定位进行寻找

    driver.find_element(By.CLASS_NAME, "t").find_element(By.TAG_NAME,"a")

    操作测试对象

    定位完元素之后当然是要对其进行操作啦.

    在webdriver中常用的操作对象有:

    • click 点击
    • send_keys 在对象上模拟按钮输入
    • clear 清楚对象输入的文本
    • submit 提交
    • text 获取元素的文本内容

    等待

    在selenium中,等待分为隐式等待,显示等待与强制等待

    强制等待

    time包中的sleep-单位为秒(s)

    time.sleep(5) #页面强制等待5s

    显式等待

    对特定的元素进行等待

    1. #显式等待,直到元素被加载出来.条件是10s内,每0.5秒进行尝试点击.如果元素加载出来了就停止等待
    2. #超过10s找不到就抛异常
    3. tmp = WebDriverWait(browser,10,0.5).until(EC.presence_of_element_located((By.LINK_TEXT,'我的世界Minecraft中国版官方网站——你想玩的,这里都有')))
    4. tmp.click()

    隐式等待

    隐式等待(设置一次,全局生效)

    会对所有将要被操作元素进行等待

    在下一个被操作的元素没有加载出来之前会进行等待,等待的时长为20,单位为秒

    driver.implicitly_wait(20)

    鼠标点击与键盘的输入

    send_keys()

    在输入框中输入文本

    click()

    对元素进行点击

    1. from selenium.webdriver.common.keys import Keys
    2. driver.find_element(By.ID, "kw").send_keys("B站")
    3. driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)#对输入框的内容进行键盘上的Enter操作

    submit()

    提交表单,对type为submit类型的元素.触发表单的提交

    text

    获取元素的文本信息

    driver.find_element(By.TAG_NAME,"a").text

    打印信息

    页面的title,URL...都可以获取出来

    但是驱动的title和URL等属性都是当前驱动所在页面的属性,并不是浏览器上最新页面的属性

    例如:

            在百度搜索结果页面,点开了一个超链接.新建了页面A

            但此时浏览器驱动还是在百度搜索结果页面上,此时直接去搜索页面A的元素是会报错的

            而通过driver.title获取页面的标题,得到的也只是百度搜索结果页面的标题,并不是A的标题

    浏览器的操作

    对页面的控制,

    浏览器最大化

    driver.maximize_window()

    将页面调整至最大化

    浏览器的宽与高

    driver.set_window_size(#{宽},#{高})

    浏览器的前进与后退

    driver.forward() # 前进 driver.back # 后退

    键盘按键

    模拟键盘操作,首先要导入keys包

    from selenium.webdriver.common.keys import Keys # 键盘按钮包

    通过键盘的输入方法send_keys来进行下面的操作

    常用按键方法

    1. send_keys(Keys.TAB) # 按下tab
    2. send_keys(Keys.ENTER) # 按下回车
    3. send_keys(Keys.SPACE) # 按下空格
    4. send_keys(Keys.ESCAPR) # 按下回车键

    键盘组合键用法

    注意组合键后面的英文字母为小写

    1. send_keys(Keys.CONTROL,'a') # 全选
    2. ctrl + a send_keys(Keys.CONTROL,'c')
    3. send_keys(Keys.CONTROL,'x')
    4. send_keys(Keys.CONTROL,'v')

    鼠标事件

    鼠标事件也要导入包

    from selenium.webdriver.common.action_chains import ActionChains

    ActionChains类 (执行链)中的方法有

    • context_click(#{element}) # 右键
    • double_click(#{element}) # 双击
    • drage_and_drop(#{element},#{target}) # 拖动元素至目标 target也是元素
    • move_to_element(#{element}) # 指针移动到元素

    alert,conirm,prompt的处理

    这是关于弹窗的处理,首先来说明一下三个弹窗

    • alert,警告类弹窗.只有确认键
    • confirm,询问类弹窗,询问是否继续某些操作.有确认与取消键
    • prompt,消息类弹窗,含有输入框,可能会要输入内容,有确认与取消键
    1. alter = driver.switch_to.alert # 将驱动定位到当前弹窗:alert/confirm/prompt上
    2. alter.text # 获取当前弹窗的文本
    3. alter.accept() # 按下当前弹窗的确认键
    4. alter.dismiss() # 按下当前弹窗的取消键-如果有的话
    5. alter.send_keys("要输入的内容") # 在弹窗的输入框中输入内容-如果有的话

    上传文件的操作

    找到type为file的input标签,使用send_keys方法添加本地文件的路径

    selenium简单使用流程

    1. driver = webdriver.Edge()
    2. driver.implicitly_wait(30)
    3. driver.get("https://www.baidu.com/index.htm")
    4. driver.maximize_window() # 设置页面最大化
    5. driver.find_element(By.ID, "kw").send_keys("蜡笔小新")
    6. driver.find_element(By.ID, "kw").send_keys(Keys.ENTER)
    7. driver.switch_to.window(driver.current_window_handle)
    8. saveH3 = driver.find_elements(By.CLASS_NAME, "t") # 获取所有的t
    9. for a in saveH3: # 遍历t中的a,获取文本并打印
    10. data = a.find_element(By.TAG_NAME, "a").text
    11. print(data)
    12. alter = driver.switch_to.alert # 将驱动定位到当前弹窗:alert/confirm/prompt上
    13. alter.text # 获取当前弹窗的文本
    14. alter.accept() # 按下当前弹窗的确认键
    15. alter.dismiss() # 按下当前弹窗的取消键-如果有的话
    16. alter.send_keys("要输入的内容") # 在弹窗的输入框中输入内容-如果有的话

  • 相关阅读:
    tensorflow深度学习模型读取parquet数据进行训练实现
    如何实现施耐德Twido系列PLC远程上下载
    敏捷项目管理解锁:2023年使用YouTrack的全面指南
    前端培训丁鹿学堂:vue性能优化总结(二)
    Linux NVMe Driver学习笔记之6:Admin Queue与Blk-mq初始化
    一个简单易用的家庭库存管理系统、已开源
    2.1.C++项目:网络版五子棋对战之前置知识
    Nginx---经常使用的一些模块、功能
    哪些手机系统必备,却鲜为人知的APP?
    字节码进阶之JSR269详解
  • 原文地址:https://blog.csdn.net/weixin_67719939/article/details/134063648