繁体   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