当前位置: 首页 > 知识库问答 >
问题:

python selenium点击被弹出窗口阻止

公孙宸
2023-03-14

当我试图单击位于弹出菜单后面的按钮时,我收到以下错误消息。

*** selenium.common.exceptions.ElementClickInterceptedException: Message: Element <input id="submitButton" class="search-button icon-search active" type="submit"> is not clickable at point (729.2000122070312,22) because another element <div id="monetate_lightbox_mask" class=""> obscures it

此错误消息能够识别阻止我单击的内容的名称

我如何获得这个名称(作为一个元素),以便进行修改,

element = <div id="monetate_lightbox_mask" class="">

browser.execute_script("""var element = arguments[0]; element.parentNode.removeChild(element);""", element)

等待功能不适用,因为此弹出窗口不会消失。我试过网络驱动程序。ActionChains,但它不能解决这个问题

共有2个答案

傅峰
2023-03-14

如果我理解正确,你基本上不想硬编码monetate_lightbox_mask id并将其解析为异常消息。可以采用如下方法:

import re

from selenium.common.exceptions import ElementClickInterceptedException


error_pattern = re.compile(r'another element <div id="(.*?)".*? obscures it')
submit_button = driver.find_element_by_id("submitButton")

try:
    submit_button.click()
except ElementClickInterceptedException as e:
    print("Blocking element detected. Removing..")

    blocking_element_id = error_pattern.search(e).group(0)  # TODO: error handling
    blocking_element = driver.find_element_by_id(blocking_element_id)
    browser.execute_script('var element = arguments[0]; element.parentNode.removeChild(element);', blocking_element)

    print("Element removed. Clicking again...")
    submit_button.click()

在这里,我们将正则表达式模式应用于错误消息以提取id值,该值引入了该阻塞元素具有id的假设。我们可以改进它以查找所有属性,然后使用这些属性来定位阻塞元素。

我们甚至可以使用类似BeautifulSoupHTML解析器来解析错误消息并在其中查找HTML元素,而不是使用正则表达式:

In [1]: from bs4 import BeautifulSoup

In [2]: data = """
   ...: *** selenium.common.exceptions.ElementClickInterceptedException: Message: Element <input id="submitButton" cla
   ...: ss="search-button icon-search active" type="submit"> is not clickable at point (729.2000122070312,22) because 
   ...: another element <div id="monetate_lightbox_mask" class=""> obscures it
   ...: """

In [3]: soup = BeautifulSoup(data, "html.parser")

In [4]: for element in soup():
   ...:     print(element)
   ...:     
<input class="search-button icon-search active" id="submitButton" type="submit"/>
<div class="" id="monetate_lightbox_mask"> obscures it
</div>

In [5]: blocking_element = soup()[-1]

In [6]: blocking_element.name
Out[6]: 'div'

In [7]: blocking_element.attrs
Out[7]: {'class': [''], 'id': 'monetate_lightbox_mask'}

另一个注意事项:如果有多个阻塞弹出窗口,则可能需要递归应用此方法。

宫元徽
2023-03-14

另一个有趣的解决方法是通过javascript执行单击-在这种情况下,它前面的内容或阻止它都无关紧要:

submit_button = driver.find_element_by_id("submitButton")
driver.execute_script("arguments[0].click();", submit_button)

此外,请注意常规selenium点击和通过javascript点击之间的区别:

  • WebDriver点击()与JavaScript点击()
 类似资料:
  • 我有这段代码显示了一个按钮谁显示一个弹出窗口,我希望用户能够关闭弹出窗口点击它的外部时,它是打开的。

  • 我在我的网站上有一个按钮,允许用户通过Yodlee/Plaid使用弹出的登录屏幕登录到他们的银行。问题是弹出窗口被safari和chrome手机屏蔽了。弹出窗口在桌面上工作。我读到过safari和chrome会阻止所有弹出窗口,如果用户没有点击按钮启动弹出窗口,或者弹出窗口从点击事件开始超过一秒。 我的问题是,在启动弹出窗口之前,我的前端必须调用我的后端来检索令牌。所有这些都需要超过一秒钟的时间,

  • 我在我的项目中为10个产品创建了剑道网格。当我点击剑道网格中显示的productname时,我希望弹出包含产品详细信息的剑道窗口。 我已经查看了剑道网格的演示,但我不想编辑所选产品的详细信息,也不想使用示例和演示中所示的“详细信息”按钮的单独列。 我还查看了剑道ui的音乐商店演示,但我无法理解它的代码,因为它在jQuery中,我正在使用asp。net mvc与我的项目的razor语法 注意:我希望

  • 问题内容: 我知道可以检测其他浏览器是否阻止了弹出窗口的javascript技术。这是基本测试: 但这在Chrome中不起作用。阻止弹出窗口时,永远不会到达“弹出窗口被阻止”部分。 当然,该测试在一定程度上是可行的,因为Chrome实际上并没有阻止弹出窗口,而是在右下角的最小化最小窗口中打开了该窗口,其中列出了“阻止的”弹出窗口。 我想做的就是能够确定弹出窗口是否被Chrome的弹出窗口阻止程序阻

  • O/S:BrowserStack Live 浏览器:IE11 **编辑:2017年3月7日** 此错误仅发生在以下情况:进行付款,导航到另一个页面,然后尝试另一个付款。

  • 本文向大家介绍java实现点击按钮事件弹出子窗口,包括了java实现点击按钮事件弹出子窗口的使用技巧和注意事项,需要的朋友参考一下 本文实例为大家分享了java实现点击按钮事件弹出子窗口的具体代码,供大家参考,具体内容如下 要求: 1、在父窗口中添加一个按钮 2、点击按钮弹出子窗口 注意:这是JDK1.7版本 在JDK1.7之前,JFrame是不能直接添加子窗口的,要先将JInternalFram