目标:
我想通过下面的代码点击正文;
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 / 等)
在这种情况下,如果有覆盖,常规的 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提出一个很好的功能请求。但如果保证它是唯一的选择器,您可以解析它,然后单击它。