[英]Selenium Python xpath contains and sibling question
我正在嘗試在網頁上使用 python selenium 到 select 用戶並打開指向他們個人資料的鏈接。 以下是網頁上每個用戶的重復 HTML:
<div class="w-50-ns w-100 ph1">
<div class="w-100 br1 pointer bg-animate hover-bg-dark-primary bg-near-black" onclick="openLink(event, '/users/0000')">
<div class="pv2 pr3 pl2 mb2 br1">
<div class="flex items-center pa1">
<div class="flex-auto mw-100">
<div class="flex items-center">
<div class="flex-none flex items-center">
<a class="relative overflow-hidden dib mr3-ns mr2 link" data-tippy-theme="lighter small" href="/users/0000" aria-expanded="false">
<img class="db ipp br1 object-cover" src="https://" width="70" height="70">
</a>
</div>
<div class="relative flex-auto mw-100 mw-none-ns" style="max-height: 58px; top: -1px;">
<div class="lh-copy truncate silver">
<a class="link span f5 fw7 secondary" href="/users/0000">UserName</a>
<span class="f6 fw7 silver">AgeSex Category</span>
</div>
<div class="f6 lh-copy fw4 silver nowrap truncate">Los Angeles, California</div>
<div class="relative pd1 f6 fw4 lh-copy mid-gray nowrap truncate">
<a class="link gray hover-silver" href="/users/0000/pictures"># pics</a>
·
<a class="link gray hover-silver" href="/users/0000/posts"># posts</a>
</div>
</div>
</div>
</div>
<div class="flex">
<div class="tr">
</div>
</div>
</div>
</div>
</div>
</div>
這是我正在研究的主要部分。 我正在嘗試檢查 AgeSex(即 19F 或 20M)是否與選定的范圍和性別匹配,如果匹配,請單擊其上方的用戶個人資料鏈接
<div class="lh-copy truncate silver">
<a class="link span f5 fw7 secondary" href="/users/0000">UserName</a>
<span class="f6 fw7 silver">AgeSex Category</span>
</div>
我試過了:
self.driver.find_elements_by_xpath("//span[contains(., '18F') or contains(., '20M')])/preceding-sibling::class[ @name = 'link span f5 fw7 secondary']").click()
self.driver.find_elements_by_xpath("//span[contains(text(), '18F') or contains(text(), '20M')])/preceding-sibling::class[ @name = 'link span f5 fw7 secondary']").click()
但我得到了錯誤:
actions.move_to_element(element, 0, 0).perform()
TypeError: move_to_element() takes 2 positional arguments but 4 were given
我是新手,所以我不知道我是否朝着正確的方向前進,任何幫助將不勝感激。 謝謝你。
我可以使用以下命令執行單擊:
driver.find_element_by_xpath("//span[contains(., '18F') or contains(., '20M')]/preceding-sibling::a[@class = 'link span f5 fw7 secondary']").click()
這里有一些注意事項:
對於前面的兄弟,語法是前面的兄弟::{xPath} --> 前面的兄弟::tagname[@attibute='value']
我建議您使用find_element_by xpath
(單數)而不是find_elements_by_xpath
(復數),因為最新返回的列表沒有click()
function。 如果要單擊多個元素,請使用find_elements_by_xpath
列出它們,然后遍歷它們以單擊每個元素的前一個兄弟。
例如:
elems = driver.find_elements_by_xpath("//span[contains(., '18F') or contains(., '20M')]")
for elem in elems:
elem.find_element_by_xpath("./preceding-sibling::a[@class = 'link span f5 fw7 secondary']").click()
所以我今天玩了一下,發現了如何打開單個AgeSex的url:
self.driver.find_element_by_xpath("//span[contains (.,'23F')]").click();
我決定 go 另一條路線,而不是點擊一個元素,列出所有網址。
self.driver.find_element(By.XPATH,"//span[contains (.,'30F')]/preceding-sibling::a[1]").get_attribute('href')
以上只是一個單一的 AgeSex,所以我必須為每個選項寫出來。 如果一個不存在,它會拋出一個錯誤,所以我為每個都寫了一個 try 和 except 塊:
try:
if self.driver.find_element(By.XPATH, "//span[contains (.,'27F')]").is_displayed():
user27 = self.driver.find_element(By.XPATH,"//span[contains (.,'27F')]/preceding-sibling::a[1]").get_attribute('href')
if user27 not in urls:
urls.append(user27)
except:
pass
如果屬性存在,它會將 href 添加到列表中。
我覺得必須有更好的方法來寫這個。 一種更高效且不需要 10-15 次嘗試和除塊的方法
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.