:first /:first-child似乎不适用于Selenium 2

时间:2011-07-05 15:32:18

标签: java selenium css-selectors

从Selenium 1迁移到Selenium 2时,我遇到了一个问题。

我的结构等同于以下内容:

<ul id="documentType">
    <li><a href="http://somelink.com">first</a></li>
    <li><a href="http://someotherlink.com">second</a></li>
    <li><a href="http://someotherlink.com">third</a></li>
</ul>

以前我会在Selenium 1中使用以下css选择器来查找第一个锚链接:

#documentType li:first-child a

然而,当我切换到selenium 2并尝试使用未找到的等效I get元素时,这会很有用。以下工作确实有效,但不像我想的那么精确。

#documentType li a

我已经尝试但无法开展以下工作:

#documentType li:first a

更多细节我正在使用HtmlUnitDriver,代码如下:

driver.findElementByCssSelector("#documentType li a");

任何有关获得原始选择器等效工作的帮助我都会非常感激!

我感到困惑:)

编辑:Phill Sacre提出了一个很好的观点,我直接使用HtmlUnitDriver这可能是问题的根源,因为它是纯粹的java实现。我这样做是为了能够处理一个令人讨厌的Ajax问题,即如何知道Ajax何时运行完毕。您可以使用以下代码执行此操作:

protected void waitForAjaxToComplete() {
  long result = jQueryActive();
  while (result != 0) {
    result = (Long) driver.executeScript("return jQuery.active;");
  }
}

这显然优于使用等待元素出现的技术,这可能是非常不准确的。我希望WebDriver公开可以解决这个问题的executeScript方法。

此外我注意到默认情况下HtmlUnitDriver确实使用基于java的实现来解析所提供的css选择器,我猜这是问题的根源。解析器是com.steadystate.css.parser.SACParserCSS21.SACParserCSS21,它可能没有正确考虑:first和:first-child限定符。

似乎可以做到这一点是HtmlUnitDriver的行为似乎默认返回第一个元素。这是姐妹方法findElementsByCssSelector似乎返回一个有序列表。

因此,虽然这似乎是一个错误,但我可能通过了解HtmlUnitDriver如何运作来回答我自己的问题。

4 个答案:

答案 0 :(得分:0)

您正在对哪个浏览器进行Selenium 1测试?查看Selenium文档,HtmlUnit driver是一个纯Java解决方案(即它显然不在浏览器中运行)。

现在我认为浏览器之间的选择器存在一些差异,所以如果您使用Firefox浏览器之前可能值得使用FirefoxDriver来运行Selenium 2测试吗?

答案 1 :(得分:0)

与Phill的答案类似 - HtmlUnit解析器页面与FF不同。我将通过使用FF驱动程序运行相同的测试来启动调试过程,看看它是否通过那里。如果它确实通过了,那么我要做的下一步是从HtmlUnit驱动程序中获取HTML(我猜命令将是driver.getPageHtml()或类似的东西)。我会将html与你通过真实浏览器(FF,chrome,..)查看html时得到的html进行比较。有时您会看到标签已被真实浏览器(即其解析器)或HtmlUnit浏览器放入。您可以更正您的选择器或使用不同的驱动程序(或告诉开发人员修复他们的HTML,因为这通常会导致这些问题: - )

答案 2 :(得分:0)

我对这个选择器有同样的问题(使用Spock / Geb)。这已在新版本的Geb中得到解决,它是0.9.2(它也对HTML单元驱动程序进行了更改)。现在$('tr:first-child a')可以正常使用HTMLUnitDriver

答案 3 :(得分:0)

我可以提供以下CSS选择器

1. css=#documentType > li > a -- First Link
2. css=#documentType > li+li > a -- Second Link
3. css=#documentType > li+li+li > a -- Third Link

否则,你可以试试

1.css=#documentType > li:nth-child(2) > a -- Second Link
2.css=#documentType > li:nth-child(3) > a -- Third Link