我正在尝试从网站获取特定的网络元素列表。所有这些元素都具有完全相同的xpath,当然只有一个。当我尝试使用以下代码提取所有这些元素时,除非列表中包含超过99个项目,否则它会完美地工作。如果xpath中的数字大于99,即使(我已经测试过)xpath保持完全相同,Selenium也不会将元素定位在该位置。
我已经尝试过挑选出这些物品,但是Selenium的行为就像第100个物品一样,而以上所有物品都不存在。
我已经选择了以下代码(简化):
String xpath="/html/body/div[1]/div/div[4]/div[2]/div[1]/div/div/div/div/section/div/div/div[2]/section/ol/div[%d]/div/li/div[2]/div/div[1]";
private void getTextFromElements(WebDriver driver){
for(int i=0; i<200; i++){
if(driver.findElements(By.xpath(String.format(xpath, i)).size()!=0){
System.out.println(driver.findElement(By.xpath(String.format(xpath, i))).getText());
}else{
break;
}
}
}
虽然它可以完美地打印出前99个项目,但引发了一个异常,即Selenium一旦到达第100个元素就无法定位该元素。
这是一个示例URL,我尝试从中提取数据:link。
答案 0 :(得分:0)
当我检查您的代码时,它具有默认的最大限制。因此,您必须在到达99后向下滚动一次。请参阅我从您的网络中提取的附件。您只能捕获网页中可用的元素。其余元素将显示在您的向下滚动选项上。您的列表中共有209个项目,但由于暂时不可见而无法获取。
向下滚动
WebDriver driver = new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollBy(0, 250)", "");
答案 1 :(得分:0)
我刚刚重新检查了问题是XPath。两种浏览器都不同。
例如,假设您要转到该列表的第一个元素,然后
firefox的xpath是/html/body/div[1]/div/div[4]/div[2]/div[1]/div/div/div/div/section/div/div/div[2]/section/ol/div[1]
您要使用的是
,但是在Chrome上是/html/body/div[1]/div/div[5]/div[2]/div[1]/div/div/div/div/section/div/div/div[2]/section/ol/div[1]
路径中的第3个div标签在Firefox中的索引为4,在chrome中的索引为5。我知道这很奇怪也很罕见。尝试更改chrome的XPath,让我知道它是否仍然无法解决。如果可行,那么您需要以一种根据浏览器使用XPath的方式来配置代码。