当我尝试单击弹出菜单后面的按钮时,收到以下错误消息。
---
此错误消息能够识别阻止我点击的内容的名称
如何获取此名称(作为元素),以便进行修改,例如
*** 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
等待功能不适用,因为此弹出窗口不会消失。 我已经尝试过webdriver.ActionChains,但不能解决这个问题
答案 0 :(得分:2)
如果我的理解正确,那么您基本上不希望对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的假设。尽管我们可以对其进行改进,以查找所有属性,然后使用这些属性来定位阻塞元素。
我们甚至可以使用诸如BeautifulSoup
HTML解析器之类的正则表达式来解析该错误消息并在其中找到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'}
另一注:如果有多个阻止弹出窗口,则可能需要递归应用此方法。
答案 1 :(得分:1)
另一个有趣的解决方法是执行通过javascript进行点击-在这种情况下,它前面的内容或阻止它都没关系:
submit_button = driver.find_element_by_id("submitButton")
driver.execute_script("arguments[0].click();", submit_button)
此外,请注意常规硒点击和通过javascript单击之间的区别: