Selenium不会通过xpath定位值大于99的元素

时间:2019-07-19 18:12:22

标签: java selenium xpath

我正在尝试从网站获取特定的网络元素列表。所有这些元素都具有完全相同的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

2 个答案:

答案 0 :(得分:0)

当我检查您的代码时,它具有默认的最大限制。因此,您必须在到达99后向下滚动一次。请参阅我从您的网络中提取的附件。您只能捕获网页中可用的元素。其余元素将显示在您的向下滚动选项上。您的列表中共有209个项目,但由于暂时不可见而无法获取。

enter image description here

向下滚动

WebDriver driver = new ChromeDriver();
JavascriptExecutor js = (JavascriptExecutor)driver;
js.executeScript("window.scrollBy(0, 250)", "");

请参阅Scroll Element into View with Selenium

答案 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的方式来配置代码。