硒:click()在我打印()时不起作用,并且在我注释掉print()时调用错误

时间:2018-08-18 03:07:01

标签: python selenium selenium-webdriver

我正在尝试使用硒将学生评论自动输入到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()使用此链接的第一个实例?

2 个答案:

答案 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单击所需的元素,它会为您工作。