前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >selenium 无头浏览器 selector 下拉框选择最强解决方案

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

原创
作者头像
Lorin 洛林
修改2023-12-20 21:27:38
5181
修改2023-12-20 21:27:38
举报
文章被收录于专栏:Python 技术小屋Python 技术小屋

前言

  • 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
复制
其实这是因为某些样式布局需要在一定条件下才会出现,你需要保证当你使用某个样式选择器时,它存在页面上
又或者你代码中的速度太快,新的样式还没有加载出来,那么你也可能选择不到,你可以暂时的等待元素加载

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

个人简介

? 你好,我是 Lorin 洛林,一位 Java 后端技术开发者!座右铭:Technology has the power to make the world a better place.

? 我对技术的热情是我不断学习和分享的动力。我的博客是一个关于Java生态系统、后端开发和最新技术趋势的地方。

? 作为一个 Java 后端技术爱好者,我不仅热衷于探索语言的新特性和技术的深度,还热衷于分享我的见解和最佳实践。我相信知识的分享和社区合作可以帮助我们共同成长。

? 在我的博客上,你将找到关于Java核心概念、JVM 底层技术、常用框架如Spring和Mybatis 、MySQL等数据库管理、RabbitMQ、Rocketmq等消息中间件、性能优化等内容的深入文章。我也将分享一些编程技巧和解决问题的方法,以帮助你更好地掌握Java编程。

? 我鼓励互动和建立社区,因此请留下你的问题、建议或主题请求,让我知道你感兴趣的内容。此外,我将分享最新的互联网和技术资讯,以确保你与技术世界的最新发展保持联系。我期待与你一起在技术之路上前进,一起探讨技术世界的无限可能性。

? 保持关注我的博客,让我们共同追求技术卓越。

我正在参与2023腾讯技术创作特训营第四期有奖征文,快来和我瓜分大奖!

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 前言
  • 版本说明
  • 最常见的方案
    • 一个简单的html页面
      • 存在的问题
      • 最强解决方案
      • 个人简介
      相关产品与服务
      云数据库 MySQL
      腾讯云数据库 MySQL(TencentDB for MySQL)为用户提供安全可靠,性能卓越、易于维护的企业级云数据库服务。其具备6大企业级特性,包括企业级定制内核、企业级高可用、企业级高可靠、企业级安全、企业级扩展以及企业级智能运维。通过使用腾讯云数据库 MySQL,可实现分钟级别的数据库部署、弹性扩展以及全自动化的运维管理,不仅经济实惠,而且稳定可靠,易于运维。
      领券
      问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
      http://www.vxiaotou.com