我正在使用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>
如果给定一个已知的电子邮件地址(电子邮件地址href
中td
的一部分),我可以进入(并点击)第一个a
td
1}}。看起来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”的x路径是正确的,因为它只是从chrome dev工具中复制的,所以错误必须是在到达第一个{{1元素。任何人都可以用我的xpath解决问题吗?
答案 0 :(得分:2)
尝试使用以下代码:
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()
这应该允许您根据表格行(href
)中最后一个链接的tr
属性匹配第一个链接,并在它变为可点击后单击它
答案 1 :(得分:1)
首先,请注意(这可能是一个毫无意义的错字)您正在寻找“mailto:needle@email.com”,而您的href属性的值是“needle@email.com”。
其次,你实际上知道如何取回[...] 。但是Xpath indexing starts with 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'
全部测试过。
答案 2 :(得分:0)
尝试找到包含该电子邮件的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')]
答案 3 :(得分:0)
你的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>
否则,您的用户可以点击该链接,直到他或她自己陷入疯狂。 :)
然后你可以在selenium中做到这一点。
>>> 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>
。