在 java 中使用 firefox webdriver 来自当前节点的 Xpath

Xpath from the current node using firefox webdriver in java

所以我在使用 findElement(By.xpath("..."))

时遇到了一个小的性能问题

首先,我要找到一个 ul 元素,其中包含大约 20 li child。 通过在每个 child 上使用 then,我通过使用以下内容将内部 xpath 定位到信息:

List<WebElement> addrBookNames = driver.findElements(By.xpath("//ul[@class='displayAddressUL']"));
for(WebElement addr : addrBookNames)
{
    String fullName = addr.findElement(By.xpath("li[@class='AddressFullName']/b")).getText();
    String addressLine = addr.findElement(By.xpath("li[@class='AddressAddressLine']")).getText();
    String city = addr.findElement(By.xpath("li[@class='AddressCity']")).getText();
    String county = addr.findElement(By.xpath("li[@class='country']")).getText();
    String phoneNumber = addr.findElement(By.xpath("li[@class='phone']")).getText();

}

上面的代码大约需要 5 秒,使用 :

检查了一下
double stime = System.currentTimeMillis();
double TotalTime = System.currentTimeMillis() - stime; 

之前和之后。

我从所选节点中提取内部 xpaths 的方式有什么问题吗?

1) 我会尝试替代 CSS 选择器方法并创建 5 个 WebElement 列表(已在搜索字段的拆分表示中):

List<WebElement> fullNames = driver.findELements(By.cssSelector("ul.displayAddressUL li.AddressFullName>b"));
List<WebElement> addressLines= driver.findELements(By.cssSelector("ul.displayAddressUL li.AddressAddressLine"));
List<WebElement> cities= driver.findELements(By.cssSelector("ul.displayAddressUL li.AddressCity"));
List<WebElement> countries=driver.findELements(By.cssSelector("ul.displayAddressUL li.country"));
List<WebElement> phoneNums=driver.findELements(By.cssSelector("ul.displayAddressUL li.phone"));

for (int i=0;i<fullNames.size(); i++){
String fullName= fullNames.get(i).getText();
String addressLine =addressLines.get(i).getText();
String city = cities.get(i).getText();
String county = countries.get(i).getText();
String phoneNumber = phoneNums.get(i).getText();
}

我还想补充一点: CSS 选择器的性能比 Xpath 好得多,并且在 Selenium 社区中有详细记录。这里有一些原因,

  • Xpath 引擎在每个浏览器中都不同,因此使它们 不一致
  • IE 没有原生的 xpath 引擎,因此 selenium 注入 其自身的 xpath 引擎以实现其 API 的兼容性。因此我们失去了 使用 WebDriver 固有的本机浏览器功能的优势 推广。
  • Xpath 趋于变得复杂,因此很难在我的文档中阅读 意见但是在某些情况下,您需要使用 xpath,例如,搜索父元素或搜索 元素的文本(我不推荐后者)。

您可以获得更多关于性能比较的详细信息here

2) 我推荐的另一种替代方法 here 尝试使用HtmlUnitDriver,那肯定会提高你的表现; 要么: 使用 Javascipt 执行器包装的纯 js 进行文本提取,如:

 String elem_css_selector="blablabla...";
 JavascriptExecutor js = (JavascriptExecutor) driver;
        StringBuilder stringBuilder = new StringBuilder();

stringBuilder.append("var x = $(\""+elem_css_selector+"\");");
        stringBuilder.append("return x.text().toString();")       ;


       String resultingText= (String) js.executeScript(stringBuilder.toString());
       Assert.assertTrue(resultingText.trim().equals("Expected Text")   );