java - 在java中使用firefox webdriver从当前节点获取Xpath

标签 java selenium xpath selenium-webdriver

因此,我在使用 findElement(By.xpath("...")) 时遇到了一个小性能问题

首先,我找到一个 ul 元素,其中包含大约 20 个 li 子元素。 通过在每个子项上使用 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; 

之前和之后。

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

最佳答案

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 注入(inject) 它自己的 xpath 引擎用于与其 API 兼容。因此我们失去了 使用 WebDriver 固有的 native 浏览器功能的优势 促进。
  • 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")   );

关于java - 在java中使用firefox webdriver从当前节点获取Xpath,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28763750/

相关文章:

java - 来自 org.w3c.dom 的 getElementsByTagName 未获取所有子节点

c# 无法使用 xpath 读取元素属性

java - 在 Java 中为变量分配动态名称

java - Java 指针写入是原子的吗?

java - 以编程方式在 TextView 中设置文本对齐方式

java - 如何使用 Selenium 单击“立即购买”按钮?

css - WebDriver Selenium:在某些元素之后需要在表中选择元素

python - ElementClickInterceptedException : element click intercepted:

xpath - 如何在 emacs nxml-mode 中搜索与 xpath 表达式匹配的元素?

xpath - 动态排序 xquery 结果