Selenium 如何点击 50% 在屏幕上和 50% 不在屏幕上的元素?

2023-11-21

有一个 div 元素。其大小的 50% 在屏幕上。另外 50% 超出屏幕高度并且不可见。 无法滚动。

我尝试使用 Selenium 进行自动化测试并单击该 div 元素,但有时它有效,有时则无效。

为什么 Selenium 不直接点击该 div 的“屏幕区域”?

以及这个功能是如何实现的呢?当我告诉 Selenium 单击一个巨大的 div 元素时,它会单击该 div 上的随机位置吗?


视图中心点中的元素

根据WebDriver W3C 规范一个元素的视野内中心点是矩形的原点位置,该矩形是元素的第一个元素之间的交集DOM客户矩形和初始viewport.

给定一个已知在视图中的元素,可以这样计算:

  1. 令矩形为通过对 element 调用 getClientRects 返回的 DOMRect 序列的第一个元素。
  2. 令 left 为 max(0, min(x 坐标, x 坐标 + 宽度尺寸))。
  3. 令 right 为 min(innerWidth, max(x 坐标, x 坐标 + 宽度尺寸))。
  4. 令 top 为 max(0, min(y 坐标, y 坐标 + 高度尺寸))。
  5. 令底部为 min(innerHeight, max(y 坐标, y 坐标 + 高度尺寸))。
  6. 令 x 为下限((左 + 右) ÷ 2.0)。
  7. 设 y 为下限((顶部 + 底部) ÷ 2.0)。
  8. 返回 (x, y) 对。

如果某个元素是其自己的可与指针交互的绘制树的成员,并且假装其指针事件未禁用,则该元素处于视图中。


元素点击

element_click

根据文档元素点击如果该元素尚未可进行指针交互,命令将滚动到该元素的视图中,然后单击其视图中的中心点。

Note:如果元素中心点被其他元素遮挡,则返回元素点击拦截错误。如果元素位于视口之外,则会返回元素不可交互错误。


Solution

在这种情况下,有两种可能的解决方案:

  1. 你可以诱导WebDriver等待设置预期条件 as element_to_be_clickable()。因此,您的代码行实际上将是:

    WebDriverWait(browser, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, ".reply-button"))).click()
    
  2. 您可以使用move_to_element(to_element) and click(on_element=None)方法分别。因此,您的代码行实际上将是:

    ActionChains(driver).move_to_element(element).click(element).perform()
    

参考

您可以在中找到相关讨论selenium.common.exceptions.ElementClickInterceptedException:消息:元素单击被拦截:元素在 Selenium 和 Python 中不可单击

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

Selenium 如何点击 50% 在屏幕上和 50% 不在屏幕上的元素? 的相关文章

随机推荐

  • 如何从 CefSharp 3 在本机浏览器中打开链接

    我需要在 CefSharp 3 的本机浏览器中打开链接 我需要在 CefSharp 3 的 chromium 浏览器中运行除表单之外的整个应用程序 当我单击表单的链接按钮 例如 注册按钮 它有一个指向注册表单的链接 时 我需要在本机浏览器
  • 带有 Flask 的 pyCUDA 给出 pycuda._driver.LogicError: cuModuleLoadDataEx

    我想在flask服务器 该文件直接使用即可正确运行python3但当使用相应的函数调用时失败flask 这是相关代码 cudaFlask py import pycuda autoinit import pycuda driver as d
  • 删除行后如何消除 rowid 编号中的间隙?

    Table tmp CREATE TABLE if not exists tmp id INTEGER PRIMARY KEY name TEXT NOT NULL 我插入了5行 select rowid id name from tmp
  • 如何检查嵌套引用中是否为 null

    寻找一些最佳实践指导 假设我有一行这样的代码 Color color someOrder Customer LastOrder Product Color 其中 Customer LastOrder Product 和 Color 可以是n
  • RODBC 和 Microsoft SQL Server:截断长字符串

    我正在尝试使用 R RODBC 从 Microsoft SQL Server 数据库查询变量 RODBC 正在将字符串截断为 8000 个字符 原始代码 截断为 255 个字符 根据 ODBC 文档 library RODBC con st
  • 如何使用 Fish Shell 管理我的节点版本

    我昨天开始使用fish作为我的shell 今天我尝试使用yarn和tailwind在终端中运行我的NextJs应用程序 但出现了有关节点版本的错误 我检查了一下 然后发现当前版本是10 19 0 在我的 zsh shell 中 我安装了 N
  • UIAlertController - 将自定义视图添加到操作表

    当我们尝试附加屏幕截图中的图像时 我正在尝试制作如 iOS 上的消息应用程序中所示的操作表 我意识到在新的 UIAlertController 中 我们无法容纳任何自定义视图 我有什么办法可以做到这一点吗 我的代码看起来很标准 let al
  • Spark 中的 Hadoop DistributedCache 功能

    我正在寻找类似于Spark中Hadoop的分布式缓存的功能 我需要一个相对较小的数据文件 带有一些索引值 出现在所有节点中 以便进行一些计算 有什么方法可以在 Spark 中实现这一点吗 到目前为止 我的解决方法包括将索引文件作为正常处理进
  • 在 django admin 中创建新的自定义视图

    抱歉 我还是 django 新手 我想在管理站点上创建与我的模型无关的自定义视图 我已阅读文档 https docs djangoproject com en 2 0 ref contrib admin django contrib adm
  • 获取 numpy 数组中元素对的总和

    我有一个数组 t 4 5 0 7 1 6 8 3 2 9 这只是 0 9 范围内的随机洗牌 我需要计算这个 t2 9 5 7 8 7 14 11 5 11 13 这就是 t2 t 0 t 1 t 1 t 2 t 2 t 3 t 3 t 4
  • 使用 ios 使用 swift 进行本地通知 [关闭]

    Closed 这个问题需要多问focused 目前不接受答案 我是 swift 的新手 我不知道如何实现本地通知 我尝试了一些代码 但它并不完全有效 所以任何人都可以帮助实现本地通知iOS using swift 在这里我分享一个例子 注册
  • 使用宏将项目附加到数组(C 语言)

    我有一个数组 C语言 应在编译时初始化 例如 DECLARE CMD f1 arg DECLARE CMD f2 arg DECLARE CMD 是从多个文件调用的 我希望对此进行预处理 my func type my funcs f1 f
  • 如何在不使用 的情况下制作带有闪烁光标和可编辑文本的 div?

    我需要制作一个 div 图层 这样当您单击它时 您的光标就会闪烁 您可以插入 删除文本 就像
  • 如何在 C# 中为 Windows-7 设置主显示器

    我相信我需要一个在 SetDisplayConfig 中执行此操作的示例 我的 Windows 7 系统有两个显示器 当我的程序处于一种模式时 第一台显示器必须打开并且是主要显示器 第二台显示器必须关闭 在其他模式下 反之亦然 第一个显示器
  • 如何列出目录中的所有文件?

    这个问题的答案是社区努力 编辑现有答案以改进这篇文章 目前不接受新的答案或互动 如何在Python中列出目录中的所有文件并将它们添加到list os listdir 返回目录中的所有内容 包括两者files and 目录 os path s
  • 使用JQ替换JSON中的下划线

    我正在与吴商务用于检索和存储信息的 API 目前我们的设置设计为使用驼峰式大小写而不是下划线 我在用着jq处理我们的信息 但我很好奇如何使用sub regex tostring 函数用驼峰命名法替换 JSON 中的下划线 这是代码示例 li
  • Xamarin Studio 2 - 最新稳定更新 - 执行任务 Aapt 时出错:源序列为空

    我正在使用 Xamarin Studio 的试用版来完成我的最后一年项目 其中包含一个 Android 应用程序 最初一切都很顺利 但今天在更新到最新的稳定版本后 我遇到了一个错误 如本文标题所述 构建日志如下 构建解决方案 MyActiv
  • 让 tmux windows 继承`activate`d anaconda 环境

    为了方便起见 并考虑到activate 环境非常慢 我想激活一个环境 然后启动一个tmux会议 我想要全新的tmuxwindows 也可以激活环境 我想要不同的tmux会话能够支持不同的 anaconda 环境 我该怎么办 是否存在任何不支
  • 比 double 更精确的浮点数据类型?

    在我的项目中 我必须在矩阵上计算除法 乘法 减法 加法double元素 问题是 当矩阵的大小增加时 我的输出的准确性会受到极大影响 目前我正在使用double对于我认为使用的每个元素8 bytes的记忆力和准确度16 digits与小数点位
  • Selenium 如何点击 50% 在屏幕上和 50% 不在屏幕上的元素?

    有一个 div 元素 其大小的 50 在屏幕上 另外 50 超出屏幕高度并且不可见 无法滚动 我尝试使用 Selenium 进行自动化测试并单击该 div 元素 但有时它有效 有时则无效 为什么 Selenium 不直接点击该 div 的