簡體   English   中英

Selenium Python xpath 包含和兄弟問題

[英]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>
                                &nbsp;
                                <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>
                                &nbsp;·&nbsp;
                                <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>
                        &nbsp;
                        <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()

這里有一些注意事項:

  1. 對於前面的兄弟,語法是前面的兄弟::{xPath} --> 前面的兄弟::tagname[@attibute='value']

  2. 我建議您使用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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM