如何通过Selenium中的html通过onclick事件单击元素?

时间:2018-08-23 05:31:55

标签: html selenium selenium-webdriver xpath webdriver

我正在尝试为网页上的链接添加xpath。 链接的HTML如下所示:

<td style="width: 50%; text-align: right; vertical-align: middle">
    <img id="ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl00_AddRecord1"  
    alt="Add Controller" src="../Images/AddRecord.gif">
        <a onclick="return ShowInsertController(2);" href="#">link</a>
</td>

有些我无法获得正确的xpath。 我尝试了以下方法:

xpath = //img[@id  ='ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl00_AddRecord1']/a -->Didnt work

xpath = //td[contains(@onclick, 'return ShowInsertController(2);')] --> Didnt work

xpath = //img[@id  ='ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl00_AddRecord1']/a[1] -->Didnt work

我无法使用链接文本,因为可以用其他语言自定义Web应用程序。 任何帮助都非常感谢。

3 个答案:

答案 0 :(得分:1)

根据 HTML ,您已通过 xpath在链接上共享给click(),文本为 link onclick()事件,您可以使用以下任一解决方案:

  • xpath 1

    //td/a[@onclick=\"return ShowInsertController(2);\"]
    
  • xpath 2

    //td/img[@alt='Add Controller' and contains(@src,'AddRecord')]//following::a[@onclick=\"return ShowInsertController(2);\"]
    

答案 1 :(得分:1)

看起来img和anchor标签是兄弟姐妹, 您是否尝试过以下代码?

//img[@id = 'ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl00_AddRecord1']/following-sibling::node()[@onclick = 'return ShowInsertController(2);']

OR

//a[@onclick = 'return ShowInsertController(2);']/preceding-sibling::node()[@id = 'ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl00_AddRecord1']

答案 2 :(得分:0)

您的第一个和第三个xpath无效,因为您试图查找<a>元素的 child <img>元素。如果您输入:

//img[whatever]/a

对于它意味着的代码,搜索<a>定位符的<img>元素的第一个子元素whatever。阅读online tutorials,以更好地了解xpath的工作原理。

来到您尝试的第二个xpath,您正在尝试借助<td>属性来定位onclick元素。其<a>元素具有该元素,而不是<td>元素。所以即使那是不正确的。

解决方案:

在您的情况下,<a><img>元素的兄弟,这意味着它被放置在<img>元素的下一个(而不是下方)相同的节点层次结构中。因此,您应该改用以下xpath:

//img[@id  ='ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl00_AddRecord1']/following-sibling::a

@cruisepandey指出ID ctl00_ContentPlaceHolder1_RadGrid1_ctl00_ctl02_ctl00_AddRecord1可以是动态的,因此应该更稳定的定位符应该是正确的:

//img/following-sibling::a[contains(text(),'link')]

或者@Debanjan提供的。