2012-08-16 50 views
2

我最近开始使用Selenium,并且我决定只使用Selenium 2/WebDriver。 在我的测试代码中,我经常到达WebElement而不知道它在页面中的位置。WebDriver Selenium API:在XPath中标识WebElement

我想要的代码,给定一个WebElement,构造一个XPath表达式来唯一地选择它。

Selenium的FireFox录音机插件可以做到这一点;我要的是代码来执行它在硒2.

我可以用WebElementfindElementwalk up the treefindElements找到我们来自的孩子写这样的代码自己,但它是平凡的拿出东西快(一再呼吁By.xpath似乎不好),并完成(例如由于命名空间)。

A related question建议使用CSS选择器来代替 - 这是我没问题。)

有没有人做到了这一点给我吗?什么是最好的方法?

回答

2

这是非常简单的:btw是css是要走的路; xpath应该只被用作最后的手段。 http://sauceio.com/index.php/2010/01/selenium-totw-css-selectors-in-selenium-demystified/解释css定位器比我在这里提供的空间更深入。

最好的办法:如果你使用firefox下载萤火虫,那会让你看看你的html。 Pres cmd + Shift + c,它会用元素荧光笔为你打开。找到你的html元素,也许它会是这个样子

<input type="submit" tabindex="110" value="Post Your Answer" id="submit-button"> 

然后你可以找到你的元素倒也干脆

WebElement element = driver.findElement(By.cssSelector("input[id='submit-button']")) 

注意,我们把标记名第一个“输入”,其次是某种括号内的唯一标识符“input [id ='submit-button']”。大多数情况下,这将覆盖您使用的所有css定位器的75%。另外的25%需要在我放在页面顶部的链接中包含一些更棘手的内容。

你可能会问:“我可以再说ID使用什么样的唯一标识符的”清楚,这里涵盖:http://release.seleniumhq.org/selenium-remote-control/0.9.2/doc/dotnet/Selenium.html

好运开始了

编辑

那么好的运气找到你元素放在第一位......如果您需要,您可以通过部分定位器文本来搜索元素,如input [id * ='submit']。当你使用部分文本作为定位器的一部分时,使用它对动态生成的元素很有帮助。

你提到走上html树,也许我没有看到,当我第一次看到这个问题。我认为你遇到了这个问题。不推荐使用html树,因为它会让html测试变得更脆弱。从长远来看,它也会使你的代码不可读。一般来说,如果你的ID缺失或不可预测,我会建议与proj交谈。管理层让开发人员编写实际上可以实现自动化的代码(例如:在关键元素上实现标识符)。这实际上可以节省您和开发人员的长期努力,并且还可以提高测试的速度和可靠性。

+0

谢谢!不幸的是,这并不能真正帮助我,因为我的元素上的大多数ID缺失或不可预测。 – reinierpost 2012-08-20 08:45:16

2

也许这会帮助:我正在测试一个网站,其中的ID是动态生成的,所以他们一直在改变。为了得到他们的XPath和工作用它,我用这个函数:

/** 
* Gets the absolute xPath for elements with dynamic ids. 
* 
* @param driver - the current WebDriver instance 
* @param element - the element for which the xPath will be found 
* @return the absolute xPath for this element 
*/ 
public static String getElementXPath(WebDriver driver, WebElement element) { 
    return (String)((JavascriptExecutor)driver).executeScript(
      "gPt=function(c)" + 
      "{" + 
      "if(c.id!=='')" + 
      "{return c.tagName + '[@id=\"'+c.id+'\"]'}" + 
      "if(c===document.body)" + 
      "{return c.tagName}" + 
      "var a=0;" + 
      "var e=c.parentNode.childNodes;" + 
      "for(var b=0;b<e.length;b++)" + 
      "{var d=e[b];" + 
      "if(d===c)" + 
      "{return gPt(c.parentNode)+'/'+c.tagName+'['+(a+1)+']'}" + 
      "if(d.nodeType===1&&d.tagName===c.tagName)" + 
      "{a++}" + 
      "}" + 
      "};" + 
      "return gPt(arguments[0]);", element); 
} 
+0

当然,如果你将它扩展到页面内部的元素,这也是可行的,但是一旦你使用了JavaScript,我认为从元素到文档根就像上面描述的那样效率更高。这种解决方案有多便携? – reinierpost 2012-08-20 08:42:11

+0

这不会一直向上,直到找到一个带有id的元素。至于可移植性,我只测试过Firefox,如果这就是你的意思。 – 2012-08-21 09:10:31

0

我们可以发现提交按钮使用ID:

1.driver.findElement(By.id(“提交按钮” ))

ID> NAME> CSS> XPATH

+0

谢谢!不幸的是,这并不能真正帮助我,因为我的元素上的大部分ID都缺失或不可预测。 – reinierpost 2014-04-07 10:05:55

相关问题