• Selenium特殊场景问题汇总


    1. ul/li下面相同属性、相同class之间,点击不同文本

    举例:如下图所示的元素属性,我们要实现点击“招聘管理”的tab,进入招聘管理页面

     思路分析:

    (1)我们在做Web端的UI自动化测试时,一定要确保页面缩放比例是100%

    (2)此处我们可以看到li里面的"data-v-5a3bd651"和class="menu_item"是一样的,id是数字递增的形式,所以我们第一反应应该有以下几种方式:

    1. browser.find_element(By.ID, '2').click(),
    2. browser.find_element(By.XPATH, '//*[@id="2"]').click(),
    3. browser.find_element(By.XPATH, '//li[@class="menu_item"][text()="项目管理"]').click()

    通过以上几种方式我们会发现均无法点击“招聘管理”,原因很简单:因为当我们鼠标去点击“招聘管理”文案的时候,它的class="menu_item"才会出现,这个时候的class才是有效的,同理根据ID=2或者XPATH的方式也是一样,所以此时我们应该需要一个不变的元素"data-v-5a3bd651"来先圈定住我们的li,然后再根据text()文本获取文案,具体实现代码如下:

    1. import time
    2. from selenium import webdriver
    3. from selenium.webdriver.common.by import By
    4. browser = webdriver.Chrome()
    5. browser.get(r'http://测试地址')
    6. browser.maximize_window()
    7. browser.find_element(By.NAME, "username").send_keys("root") # 输入账号
    8. browser.find_element(By.NAME, "password").send_keys("123456") # 输入密码
    9. browser.execute_script('document.getElementsByClassName("el-button loginbtn el-button--primary")[0].click();') # 点击登录
    10. time.sleep(1) # 等待页面加载1秒
    11. browser.find_element(By.XPATH, '//li[@data-v-5a3bd651=""][text()="项目管理"]').click()
    12. time.sleep(2)
    13. # 关闭浏览器
    14. browser.close()

    2. Select下拉框选择、非Select下拉框选择、Input型的下拉框

    2.1 Select下拉框选择

    假设在本地电脑桌面有如下的HTML:

    1. html>
    2. <html lang="en">
    3. <head>
    4. <meta charset="UTF-8">
    5. <meta name="viewport" content="width=device-width, initial-scale=1.0">
    6. <title>跳转网址title>
    7. <script type="text/javascript">
    8. function TxtToChange() {
    9. var url = document.getElementById("_url").value;
    10. switch (url) {
    11. case "https://www.baidu.com/":
    12. document.getElementById("txt").value = url;
    13. break;
    14. case "http://www.taobao.com/":
    15. document.getElementById("txt").value = url;
    16. break;
    17. case "https://www.jd.com/":
    18. document.getElementById("txt").value = url;
    19. break;
    20. }
    21. }
    22. function GoToUrl(){
    23. location = document.getElementById("txt").value;
    24. }
    25. script>
    26. head>
    27. <body>
    28. <form>
    29. <select id="_url" onchange="TxtToChange()">
    30. <option selected="selected">请选择option>
    31. <option value="https://www.baidu.com/">百度option>
    32. <option value="http://www.taobao.com/">淘宝option>
    33. <option value="https://www.jd.com/">京东option>
    34. select>
    35. <input type="text" id="txt" />
    36. <input type="button" value="跳转" onclick="GoToUrl()">
    37. form>
    38. body>
    39. html>

     我们想分别选择百度、淘宝、京东网站,可以通过Select的三种方式来获取

     特别注意:Select只对有标签的下拉框菜单中的选项,需要两个步骤:第一,先定位到选择下拉框的属性,第二,再对其中的选项进行定位。

    代码如下:

    1. # -*- coding: utf-8 -*-
    2. """
    3. @date: 2022/09/05 22:35
    4. @author: Anker
    5. @python:v3.10
    6. """
    7. import time
    8. from selenium import webdriver
    9. from selenium.webdriver.common.by import By
    10. browser = webdriver.Chrome()
    11. browser.get('http://pmp-qa.hongshan.cn:82/')
    12. time.sleep(1)
    13. # 选择数据类型
    14. time.sleep(1)
    15. # 第一步先定位到选择下拉框的属性
    16. browser.find_element(By.ID, 'form_item_dataType').click()
    17. time.sleep(1)
    18. # 第二步再对其中的选项进行定位
    19. browser.find_element(By.XPATH, '//*/span[@class="qk-select-selection-item"][text()="String"]').click()

    2.3 Input型的下拉框

    Input型下拉框的界面以及元素属性如下:

     思路分析:

    第一步,先获取Input型下拉框;
    第二步,向Input型下拉框输入内容;
    第三步,按回车键;
    第四步,点击空白区域

    代码如下:

    1. # -*- coding: utf-8 -*-
    2. """
    3. @date: 2022/09/05 22:50
    4. @author: Anker
    5. @python:v3.10
    6. """
    7. import time
    8. from selenium import webdriver
    9. from selenium.webdriver import Keys, ActionChains
    10. from selenium.webdriver.common.by import By
    11. browser = webdriver.Chrome()
    12. browser.get('http://pmp-qa.hongshan.cn:82/')
    13. time.sleep(1)
    14. """
    15. 零件状态查询
    16. """
    17. # 第一步,先获取Input型下拉框(点击”零件状态“下拉框)
    18. browser.find_element(By.XPATH, '//*[@id="filter_id_kye19uvq_1m82mvae"]/dd/div/div[1]/div').click()
    19. time.sleep(1)
    20. # 第二步,向Input型下拉框输入内容(查询零件状态为:In Work)
    21. browser.find_elements(By.XPATH, '//*[@id="rc_select_2"]')[0].send_keys("In Work")
    22. time.sleep(1)
    23. # 第三步,按回车键
    24. browser.find_element(By.XPATH, '//*[@id="rc_select_2"]').send_keys(Keys.ENTER)
    25. time.sleep(1)
    26. # 第四步,点击空白区域
    27. ActionChains(browser).move_by_offset(0, 0).click().perform() # 点击空白区域

    3. Selenium解决内嵌向右滑动滚动条的方案 

     3.1 问题背景

    现在很多web项目的前端页面会存在多个内嵌滚动条,我们在做UI自动化测试的时候,selenium一直找不到被挡住的元素,只有先把滚动条拖到对应元素显示区域内才可以定位到元素,这个时候我们用传统的js获取方式已无法获取了

     document.getElementById('id').scrollTop=10000

    3.2 问题现象

    我们常见的有竖向的内嵌上下滚动条和横向的内嵌左右滚动条,比如下图所示,页面的左右两列均固定住,只有通过拖动滚动条才能定位到自己想要的元素(比如:”外部零件号“这个字段)

    3.3 解决方案 

    (1)打开F12,点击Elements,将鼠标光标定位到内嵌的滚动条上,我们会看到这个滚动条对应的div的class

     (2)直接运用document.querySelector这个js的属性来获取即可,如下所示;

    driver.execute_script("document.querySelector('.vxe-table--body-wrapper').scrollTo(5000,0)")

    特别说明,其中:

    .vxe-table--body-wrapper前面的点是为了模糊匹配div中的class属性,另外scrollTo(5000,0)中的5000表示向右移动5000个像素,竖向不移动

    (3)如果页面的列被鼠标移动到右边了,此时我们想回到最初的位置,即输入如下命令即可:

    driver.execute_script("document.querySelector('.vxe-table--body-wrapper').scrollTo(0,0)")

  • 相关阅读:
    3、动态标签详解: if、 where、trim、set、 foreach、choose、bind
    多线程篇1:java创建多线程以及线程状态
    oracle查询相同条件重复值只取第1条
    公共方法~~
    Qt获取当前所用的Qt版本、编译器、位数等信息
    【RocketMQ】Dledger模式下的日志复制
    QT中QSS设置的三种方法
    国内最好的ai软件是哪个?探索国内顶尖AI软件的魅力与实力
    人工神经网络与神经网络,人工神经网络入门书籍
    大数据面试总结三
  • 原文地址:https://blog.csdn.net/weixin_43184774/article/details/126714484