Python 3 + Selenium:如何通过xpath找到这个元素?

时间:2016-08-20 16:33:20

标签: python html selenium xpath

https://www.facebook.com/friends/requests/?fcref=jwl&outgoing=1

我想点击"查看更多请求"在"朋友请求已发送"

<div id="outgoing_reqs_pager_57b87e5793eb04682598549" class="clearfix mtm uiMorePager stat_elem _646 _52jv">
   <div>
       <a class="pam uiBoxLightblue _5cz uiMorePagerPrimary" role="button" href="#" ajaxify="/friends/requests/outgoing/more/?page=2&page_size=10&pager_id=outgoing_reqs_pager_57b87e5793eb04682598549" rel="async">See More Requests</a>
<span class="uiMorePagerLoader pam uiBoxLightblue _5cz">
   </div>
</div>

我使用了这段代码,但它没有用。

driver.find_element_by_xpath("//*[contains(@id, 'outgoing_reqs_pager')]").click()

我收到了错误:

  

消息:元素在点(371.5,23.166671752929688)处无法点击。其他元素将收到点击:

<input aria-owns="js_8" class="_1frb" name="q" value="" autocomplete="off" placeholder="Search Facebook" role="combobox" aria-label="Search" aria-autocomplete="list" aria-expanded="false" aria-controls="js_5" aria-haspopup="true" type="text">

如何点击它?谢谢:))

1 个答案:

答案 0 :(得分:1)

实际上你在这里通过使用部分id匹配来定位元素,所以这个xpath可能不是唯一的并且返回多个元素。

find_element总是通过匹配定位符返回第一个元素,可能是它返回被其他元素覆盖的其他元素而不是欲望元素,这就是为什么你遇到麻烦。

在这里,你应该尝试使用link_text来定位欲望元素,使用下面的文字: -

driver.find_element_by_link_text("See More Requests").click()

或使用partial_link_text如下: -

driver.find_element_by_partial_link_text("See More Requests").click()

Edited1 : - 如果您仍然遇到同样的异常,则需要先使用exexute_script()滚动到达该元素,然后点击以下内容: -

link = driver.find_element_by_partial_link_text("See More Requests")

#now scroll to reach this link
driver.exexute_script("arguments[0].scrollIntoView()", link)

#now click on this link 
 link.click()

或者,如果您不想滚动,可以点击exexute_script而无需滚动,如下所示: -

link = driver.find_element_by_partial_link_text("See More Requests")

#now perform click using javascript
driver.exexute_script("arguments[0].click()", link)

Edited2 : - 如果您想在循环中点击此链接直到它出现,您需要实施WebDriverWait以等到下次出现,如下所示: -

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

wait = WebDriverWait(driver, 10)

# now find link
link = wait.until(EC.presence_of_element_located((By.LINK_TEXT, "See More Requests")))

#now perform click one of these above using java_script