org.openqa.selenium.NoSuchElementException: 无法使用 HtmlunitDriver/Phantomjs 定位节点

org.openqa.selenium.NoSuchElementException: Unable to locate a node using HtmlunitDriver/Phantomjs

我正在使用 HTMLUnitDriver。它无法找到 xpaths 和 css 选择器

WebDriver d=new HtmlUnitDriver();
WebDriverWait wait = new WebDriverWait(d, 10);
// d.manage().timeouts().implicitlyWait(20, TimeUnit.SECONDS);
d.get("http://www.google.com");
//d.manage().window().maximize();
d.findElement(By.name("q")).sendKeys("flipkart");
d.findElement(By.name("btnG")).click();
Thread.sleep(5000);
String s1 = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='rhs_block']/ol/li/div[1]/div/div[1]/ol/li[2]/div/div[1]"))).getText();
//String s1=d.findElement(By.cssSelector("div.kno-ecr-pt.kno-fb-ctx")).
Assert.assertEquals(s1,"Flipkart");
System.out.println(s1);
d.close();
d.quit();

它适用于所有浏览器但不适用于 HTMLUNITDRIVER

我读了一些帖子说我们需要等待我在 selenium 中尝试了所有可能的等待。

我尝试过使用 PhantomJS,但遇到了同样的问题,无法定位 xpath。

File file = new File("C:/jars/phantomjs-2.0.0-windows/bin/phantomjs.exe");             
System.setProperty("phantomjs.binary.path", file.getAbsolutePath());        
WebDriver d = new PhantomJSDriver(); 

//WebDriver d=new HtmlUnitDriver();
WebDriverWait wait = new WebDriverWait(d, 10);
d.get("http://www.google.com");
//  d.manage().window().maximize();
d.findElement(By.name("q")).sendKeys("flipkart");
d.findElement(By.name("btnG")).click();
Thread.sleep(5000);
String s1 = wait.until(
        ExpectedConditions.visibilityOfElementLocated(By.xpath(".//*[@id='rhs_block']/ol/li/div[1]/div/div[1]/ol/li[2]/div/div[1]"))).getText();
//String s1=d.findElement(By.cssSelector("div.kno-ecr-pt.kno-fb-ctx")).
Assert.assertEquals(s1,"Flipkart");
System.out.println(s1);
d.close();
d.quit(); 

HtmlUnitDriver 在某些网站上可能有问题。您的另一个选择可能是使用 PhantomJS。 .

当我们使用 HtmlUnitDriver 时,我们没有得到 rhs 块(显示在右侧的 flipkart 信息部分)。我试图获取页面源 (htmlunitsdriver),发现它不包含 rhs 块的 html 标记。当我们使用 firefox 驱动程序时也会出现同样的情况。

可能是 rhs 块需要一些物理浏览器支持才能显示。(可能是,只是假设)。

因此,由于它没有出现,您将收到 HtmlUnitDriver 的 NoSuchElementException

这是因为 HTMLUnit 和 PhantomJS 的显示大小默认情况下会呈现页面的移动版本(如果存在)。您可以通过显式设置驱动程序的显示大小来解决此问题:

driver.manage().window().setSize(new Dimension(1920, 1200));

其中 1920 是 window 像素宽度,1200 是 window 像素高度。将它们设置为您认为可以接受的任何值。

我发现问题出在我使用的 jar phantomjsdriver-1.1 的 jar 上。0.jar 我现在更改了 jar 的版本,即 phantomjsdriver-1.2。1.jar 工作得很好.

感谢朋友的帮助