繁体   English   中英

Xpath:根据相邻元素的属性匹配一个元素

[英]Xpath: matching one element based on attribute of neighboring element

我已经尝试使用Selenium / Python使用以下格式的标记:

    <tr>
        <td><a href="www.google.com">google</a></td>
        <td>useless text</td>
        <td>useless text2</td>
        <td>useless text3</td>
        <td><a href="needle@email.com">emailaddress</a></td>
    </tr>

这个想法是,给定一个已知的电子邮件地址(电子邮件地址td href一部分),我可以在第一个td进入(并单击) a 看起来xpath是使用Selenium完成此操作的最佳选择。 我正在尝试以下xpath:

//*[@id="page_content"]/table/tbody/tr[2]/td[2]/div/table[1]/tbody/tr/td[4]/a[contains(@href, "mailto:needle@email.com")]/../../td/a[0]

但我收到此错误:

selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"xpathhere"}

我确实知道到达“ needle@email.com”的xpath是正确的,因为它只是从chrome开发工具中复制的,因此在到达第一个a元素后,错误必定是xpath的一部分。 谁能阐明我的xpath问题?

尝试使用以下代码:

from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import WebDriverWait as wait

xpath = '//td[a[@href="needle@email.com"]]/preceding-sibling::td/a'
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath))).click()

这应该使您能够根据表行( tr )中最后一个链接的href属性来匹配第一个链接,并在可点击后单击它

首先,请注意(这可能是毫无意义的输入错误),而href属性的值为“ needle@email.com”,则您正在寻找“ mailto:needle@email.com”。

其次,您实际上知道如何找回[...] 但是Xpath索引从1开始 因此,为什么这个'a[0]'也是错字吗?

无论如何,这个xpath会让你的兄弟

'//a[contains(@href, "needle@email.com")]/../../td[1]/a[1]'

或比使用contains更为准确(因为您可能还有其他可以匹配的电子邮件地址,例如“ otherneedle@email.com”)

'//a[@href="needle@email.com"]/../../td[1]/a[1]'

甚至更好,即没有索引,没有父母/孩子喜欢的探索。

'//td[a[@href="needle@email.com"]]/preceding-sibling::td/a'

全部测试。

尝试找到包含该电子邮件的tr ,然后单击它的第一个链接。

//tr[.//a[contains(@href, 'your_email')]]//a

要么

//tr[.//a[contains(@href, 'your_email')]]//a[@href]

要么

//tr[.//a[contains(@href, 'your_email')]]//a[contains(@href, 'common_url_part')]

您的HTML应该是这样。

<tr>
    <td><a href="www.google.com">google</a></td>
    <td>useless text</td>
    <td>useless text2</td>
    <td>useless text3</td>
    <td><a href="mailto:needle@email.com">emailaddress</a></td>
</tr>

否则,您的用户可以单击链接,直到他或她变得疯狂为止。 :)

然后,您可以在硒中做到这一点。

>>> from selenium import webdriver
>>> driver = webdriver.Chrome()
>>> driver.get("file://c:/scratch/temp2.htm")
>>> link = driver.find_element_by_xpath('.//a[contains(@href,"needle@email.com")]')
>>> link.click()

我之所以使用contains是因为链接中的电子邮件地址可能类似于mailto:Jose Greco <needle.email.com>

PS:顺便说一句,我刚刚在我的机器上执行了这些东西。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM