因此,在使用findElement(By.xpath("..."))
首先,我找到一个包含大约20 ul
个孩子的li
元素。
然后在每个孩子身上使用i,通过使用以下内容将内部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
的方式有什么问题吗?
答案 0 :(得分:3)
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社区中得到了很好的记录。以下是一些原因,
有关效果比较的更多详情,请访问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") );