如何使用 Python 在 Selenium 中解决元素不可点击的问题 [重复]

Posted

技术标签:

【中文标题】如何使用 Python 在 Selenium 中解决元素不可点击的问题 [重复]【英文标题】:How to solve element is not clickable at point in Selenium using Python [duplicate] 【发布时间】:2019-12-31 00:10:02 【问题描述】:

我正在测试一个运行大约 200 页的脚本。每个页面都包含一个我需要单击的编辑按钮。在大约一半的页面中,这已成功完成,但在另一半中,我收到一条错误消息,指出另一个元素将收到点击。

我知道为什么会产生错误,但我不知道如何解决它。

有一个选项卡有时会完全阻止编辑按钮(取决于页面的长度/宽度以及编辑按钮的位置)。

Not clickable Clickable

我在类似问题上尝试了很多不同的建议,但我尝试过的没有一个对我有用。尤其是这些建议似乎很有希望:

Debugging "Element is not clickable at point" error

编辑按钮的 html

<div class="aikis-task-portlet-buttons-panel-button" style="">  
    <input type="button" value="Edit" 
 onclick="_aikistaskgeneric_WAR_aikistaskportlet_INSTANCE_6mbS_openFlashEditMode()" style="width: 85px">     
</div>

阻碍选项卡的 HTML

<div id="userVoicelink" onclick="__displayUserVoicePanel()">    
   Suggestions for improvement
</div>

问:有没有可能让它不可见?

我目前的代码是:

edit_button = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Edit']")))
driver.execute_script("arguments[0].scrollIntoView();", edit_button)
edit_button.click()

产生的异常是:

ERROR:root:Message: unknown error: Element <a data-toggle="tab" href="#settings">...</a> is not clickable at point (352, 31). Other element would receive the click: <div id="curtain" style="opacity: 0.301426;">...</div>

通过使用 driver.execute_script("window.scrollTo(0, 350)") 并将“350”更改为不同的值,我可以使一些按钮可点击。问题是编辑按钮不在所有页面上的同一位置。一种解决方案是使用该函数进行循环,增加 Y 值,同时检查按钮是否可点击/可见。所以我尝试了,但是下面的代码会产生以下错误:

    y = 350
    driver.execute_script("window.scrollTo(0, y)") 

WebDriverException:未知错误:y 未定义

问:是否可以获取按钮的坐标,然后使用例如 driver.execute_script("arguments[0].scrollIntoView();", edit_button) 要么 driver.execute_script("window.scrollTo(0, 350)") 但是偏移位置以便它会在编辑按钮下方稍微滚动?

顺便说一句,我正在使用 chromedriver,但在尝试 geckodriver 时遇到了同样的问题。

【问题讨论】:

如果您仍需要帮助,请提供minimal reproducible example。具体来说,如果您提供可与脚本一起使用的最小 HTML 页面,将会有所帮助。这应该都在一个&lt;html&gt;&lt;/html&gt; 标签内,并且只包括重现问题所必需的部分。此外,包括一个完整的、可运行的 Python 脚本,说明您尝试使用 selenium 做什么。 【参考方案1】:

关于您的最后一条错误消息,在我看来您没有设置 y 值,而只是设置了字符“y”。假设您使用的是 Python 3,这应该可以解决:

y = 350
driver.execute_script(f"window.scrollTo(0, y)")

更“直接”,虽然 Pythonic 会少一点:

y = 350
driver.execute_script("window.scrollTo(0, " + str(y) +")")

编辑:根据可能的重复,您还可以尝试修改代码以通过 javascript 单击按钮:

edit_button = WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Edit']")))
driver.execute_script("arguments[0].scrollIntoView();", edit_button)
driver.execute_script("arguments[0].click();", edit_button)

【讨论】:

谢谢!!那行得通。我会做一个循环,看看我是否可以这样解决问题 好的,如果有效,请标记为答案... 当然!一旦我解决了这个问题。您对我是否可以编写循环有任何建议。我被抛出循环,因为它立即触发is not clickable at point (482, 630). Other element would receive the click:exception。执行时,循环内edit_button = WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.XPATH, "//input[@value='Edit']")))edit_button.click() 是否可以检索编辑按钮的 y 坐标值(如何?)。 y_value_of_edit = function to retrieve y valuey_offset = y_value_of_edit + 10driver.execute_script(f"window.scrollTo(0, y_offset)")edit_button.click() Mhh,您是否尝试过标记为与您重复的问题中的建议?具体来说,我会开始将edit_button.click() 更改为driver.execute_script("arguments[0].click();", edit_button)

以上是关于如何使用 Python 在 Selenium 中解决元素不可点击的问题 [重复]的主要内容,如果未能解决你的问题,请参考以下文章

Python:如何在 for 中解压缩多个值?

如果使用struct.pack(fmt,v1,v2,...)在python打包,如何在cpp中解压缩数字

如何在 Python 中解压缩 RDD 中每个项目的值(列表)?

如何在 pandas 数据框中解连接或取消连接字符串值?

在python中解包元素

在应用函数中解压缩的值太多(python 2)