点击被拦截,其他元素将收到点击。允许其他元素接收点击

问题描述 投票:0回答:1

目标:

我想通过下面的代码点击正文;

WebDriverWait(driver,1).until(EC.element_to_be_clickable((By.XPATH, '//body'))).click()

问题:

我的解决方案需要灵活,如果有覆盖,点击会被拦截并抛出错误;

Message: element click intercepted: Element <body>...</body> is not clickable at point (502, 337). 
Other element would receive the click: <div class="_4xvap4u"></div>

问题:

我搜索了很长时间如何实现“允许单击”,在这种情况下单击错误显示的其他元素。

因此,我想继续单击(主体),以防它被拦截,然后单击覆盖主体的元素(显示错误的 div / iframe)。我需要它是灵活的,所以无论覆盖什么,都会收到点击(div / iframe /modal / 等)

python selenium-webdriver selenium-chromedriver webdriver webdriverwait
1个回答
1
投票

在这种情况下,如果有覆盖,常规的 selenium 单击将引发该异常,但您可以从 selenium 执行 JS 来解决该问题。 如何用JavaScript模拟点击?

css_selector = "body"
script = (
    """var simulateClick = function (elem) {
           var evt = new MouseEvent('click', {
               bubbles: true,
               cancelable: true,
               view: window
           });
           var canceled = !elem.dispatchEvent(evt);
       };
       var someLink = document.querySelector('%s');
       simulateClick(someLink);"""
    % css_selector
)
driver.execute_script(script)

(如果您的 css_selector 包含引号,您可能需要先转义它们,例如在运行之前使用

re.escape(CSS_SELECTOR)
。)

如果您正在寻找一种更简单的方法在 selenium 中进行 JS 单击,可以使用 Python Selenium 框架 https://github.com/seleniumbase/SeleniumBase,它已经有一个方法:

self.js_click("SELECTOR")
.


如果始终是相同的元素叠加,您可以先使用

if
语句(如果可见)单击它。

def is_element_visible(selector, by="css selector"):
    try:
        element = driver.find_element(by, selector)
        if element.is_displayed():
            return True
    except Exception:
        pass
    return False

if is_element_visible("div._4xvap4u"):
    driver.find_element("css selector", "div._4xvap4u").click()

WebDriverWait(driver,1).until(EC.element_to_be_clickable((By.XPATH, '//body'))).click()

如果不能保证该选择器在异常消息

Other element would receive the click: <div class="_4xvap4u"></div>
中是唯一的,那么它会向https://github.com/SeleniumHQ/selenium提出一个很好的功能请求。但如果保证它是唯一的选择器,您可以解析它,然后单击它。

© www.soinside.com 2019 - 2024. All rights reserved.