我正在尝试使用硒将学生评论自动输入到D2L中。我遇到一个问题,D2L在同一页面上每个元素都有2个实例。
GFD = driver.find_element_by_xpath("//a[@class='d2l-imagelink'][starts-
with(@id,'ICN_Feedback_')][contains(@title,'Enter comments for FIRSTNAME
LASTNAME in a new window')]")
print(GFD)
GFD.click()
print()
返回:
<selenium.webdriver.remote.webelement.WebElement
(session="729913326ada06df2b665cb77e224755", element="0.5122921302415122-1"
,但是GFD.click()
无法正常工作。
让我更困惑的是,如果我注释掉print()
,我会从GFD.click()
那里得到一个错误
Message: unknown error: Element <a class="d2l-imagelink"
id="ICN_Feedback_3400653_125630" href="javascript:void(0);" onclick="return
false;" title="Enter comments for FIRSTNAME LASTNAME in a new window" aria-
label="Enter comments for FIRSTNAME LASTNAME in a new window"
role="button">...</a> is not clickable at point (894, 858). Other element
would receive the click: <div class="d2l-floating-buttons-inner-container
style-scope d2l-floating-buttons" style="left: 7.23438px; width: 867.531px;">...</div>
(Session info: chrome=68.0.3440.106)
(Driver info: chromedriver=2.41.578737
(49da6702b16031c40d63e5618de03a32ff6c197e),platform=Windows NT 10.0.17134 x86_64)
我知道D2L在页面上放置了两个具有相同链接ID的实例(可能只是为了sp我)。是否可以使用find_elements click()
使用此链接的第一个实例?
答案 0 :(得分:0)
首先,错误消息非常说明问题所在:
在点(894,858)不可单击。其他要素 将会获得点击:
您要单击的对象听起来好像被另一个元素div覆盖了。有时甚至会无意间发生这种情况。 CSS或HTML错误可能会导致透明div覆盖任何其他DOM元素。最简单的解决方案是隐藏有问题的DIV。
GFD = driver.find_element_by_xpath("//a[@class='d2l-imagelink'][starts-
with(@id,'ICN_Feedback_')][contains(@title,'Enter comments for FIRSTNAME
LASTNAME in a new window')]")
第二,您不需要这个复杂的xpath查询。拥有ID时,请始终使用find_element_by_id。还要注意,根据python的命名约定,GFD应该为gfd。
gfd = driver.find_element_by_id("ICN_Feedback_3400653_125630")
最后。
让事情变得更加混乱
您确定在xpath代码中没有在查询中使用完整ID。您仅使用其中的一部分。而且无论如何,正如我已经提到的,这里不需要xpath。
答案 1 :(得分:0)
此错误是因为另一个元素正在覆盖所需的元素,该覆盖可能是短暂的,也可能是永久的,如果短暂,则需要等待覆盖元素的隐身性,然后编写此代码点击所需的元素
所以请编写此代码以使覆盖消失
WebDriverWait(driver,10).until(EC.invisibility_of_element_located((By.XPATH, "//div[@class='d2l-floating-buttons-inner-container style-scope d2l-floating-buttons']")));
然后编写代码以单击该元素,当id存在时,就不必使用xpath
driver.find_element_by_id("ICN_Feedback_3400653_125630").click()
现在它将正常工作
注意:ElementToBeClickable
不会在这里等待,因为它假定启用元素时元素是可单击的,但是即使元素被另一个元素覆盖也被启用。
如果叠加层不是短暂的并且是永久的,则可以使用JavaScript单击所需的元素,它会为您工作。