selenium 无头浏览器 selector 下拉框选择最强解决方案

2023-12-20 21:27:38 浏览数 (1)

前言

  • Web 自动化测试中,模拟用户与下拉框(也称为选择框或下拉列表)的交互是一个常见的任务。Selenium 是一个流行的自动化测试工具,它可以通过模拟用户行为来与 Web 页面进行交互。本文将介绍在使用 Selenium 无头浏览器时,如何有效地进行下拉框选择。

版本说明

  • Python 3.12.0

最常见的方案

  • 网上最常见的方案都是说使用 Select 来选择下拉框,下面是一个简单的示例:

一个简单的html页面

代码语言:html复制
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Select Dropdown Page</title>
</head>
<body>

<h1>Select Dropdown Example</h1>

<label for="dropdown"></label><select id="dropdown">
    <option value="option1">Option 1</option>
    <option value="option2">Option 2</option>
    <option value="option3">Option 3</option>
</select>

<p id="selectedOption">Selected Option: </p>

<script>
    document.getElementById("dropdown").addEventListener("change", function () {
        var selectedOption = document.getElementById("selectedOption");
        selectedOption.innerText = "Selected Option: "   this.value;
    });
</script>

</body>
</html>
  • selenium 使用 Select 选择,这里我们使用 select_by_visible_text 方法:
代码语言:Python复制
import time

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import Select

# 初始化WebDriver,指定chrome_options
driver = webdriver.Chrome()

# 打开测试页面
driver.get("xxxxxxx")


# 选择下拉框中的选项
def select_option_by_visible_text(selector, option_text):
    select = Select(driver.find_element(By.CSS_SELECTOR, selector))
    select.select_by_visible_text(option_text)


# 示例:通过可见文本选择下拉框选项
select_option_by_visible_text("#dropdown", "Option 2")

# 进行其他操作,例如提交表单等
# ...

time.sleep(1000)
# 关闭浏览器
driver.quit()
正常选中正常选中

存在的问题

  • 但现实当中我们进行自动化测试、或者爬虫下拉框的时候网页代码可不会这么简单,比如你可能会遇到下面的问题:
代码语言:txt复制
1、标签无法选中 ElementNotInteractableException: Message: element not interactable 元素不可见
2、在框架当中可能无法使用 Select,你可能会去选择直接填充输入框,当你高高兴兴填充完你会发现第三个问题
3、填充好的下拉框无法选中,因为下拉选择可能会需要触发对应的事件,当然你也可以去慢慢尝试找到需要执行的事件
  • 其实这些你都不需要去做,下面我将介绍一个最强解决方案。

最强解决方案

  • 最强的方案其实就是最单纯的方案,即模拟用户的点击过程:
代码语言:Python复制
# 拿到可以点击出下拉框的元素标签进行点击 显示下拉框
# 获取所有下拉框元素,遍历选择你需要的元素进行点击选中

# input_1 样式选择器 点击显示下拉框
# select_1 样式选择器 获取所有下拉框元素
# 需要匹配的元素
def auto_fill_select(input_1, select_1, text):
    print("开始填充:"   text)
    WebDriverWait(driver, 60).until(
        EC.presence_of_element_located((By.CSS_SELECTOR, input_1))).click()
    
    selects = WebDriverWait(driver, 60).until(
        EC.presence_of_all_elements_located(
            (By.CSS_SELECTOR, select_1))
    )

    for element in selects:
        if element.text == text:
            element.click()
            break
  • 这里还有一个问题没有解答:样式选择器元素不可见的问题 ElementNotInteractableException
代码语言:txt复制
其实这是因为某些样式布局需要在一定条件下才会出现,你需要保证当你使用某个样式选择器时,它存在页面上
又或者你代码中的速度太快,新的样式还没有加载出来,那么你也可能选择不到,你可以暂时的等待元素加载

比如:下拉的元素可能只有下拉框出现时才可以获取

个人简介

0 人点赞