2017-05-08 91 views
0

我有以下格式我试图用硒/ Python来工作的标记属性相匹配一个元素:Xpath的:基于相邻元素

<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="[email protected]">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:[email protected]")]/../../td/a[0] 

但我发现了这个错误:

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

我知道的XPath来得到了“[email protected]”一个是正确的,因为它只是从chrome开发工具中复制而来,所以在到达第一个a元素后,错误必须与xpath的一部分相关。任何人都可以通过我的xpath了解一些问题吗?

+0

也许只是'// a [包含(@href,“[email protected]”)]'? – splash58

+0

问题是我试图检索第一个'td'中的'a',所以我需要找出匹配“[email protected]”'a'后如何返回到那个级别。 – Marcatectura

+0

你应该避免使用索引,总是使用你知道不会改变的东西,比如属性的一部分,使用索引是一个不好的做法,并不是很灵活。 – lauda

回答

1

首先,请注意(这可能是一个毫无意义的错字),您正在查找“mailto:[email protected]”,而您的href属性值为“[email protected]”。

二,你其实知道如何取回。但Xpath indexing starts with 1。那么为什么这个'a[0]',这也是一个毫无意义的错字?

无论如何,这个XPath会得到你的兄弟姊妹

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

或大于使用contains(因为你可能有其他的电子邮件不会忽略这可以匹配,例如“[email protected]”)

更准确地
'//a[@href="[email protected]"]/../../td[1]/a[1]' 

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

'//td[a[@href="[email protected]"]]/preceding-sibling::td/a' 

全部测试。

0

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

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

​​

//tr[.//a[contains(@href, 'your_email')]]//a[contains(@href, 'common_url_part')] 
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:[email protected]">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,"[email protected]")]') 
>>> link.click() 

我用contains因为链接的电子邮件地址可以是这样的mailto:Jose Greco <needle.email.com>。PS:顺便说一句,我刚刚在我的机器上执行了这个东西。

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="[email protected]"]]/preceding-sibling::td/a' 
wait(driver, 10).until(EC.element_to_be_clickable((By.XPATH, xpath))).click() 

这应该允许您根据在表行(tr)的最后一个环节的href属性匹配第一个链接,点击它,一旦它变成可点击的

+0

没有索引,对于意外问题和Selenium最先进的实践非常有效。 – Kanak