我刚刚发现了Selenium,我正在尝试学习如何将它与PhantomJS一起使用。我发现的第一个例子是关于从booking.com获取链接列表。 我试着用PhantomJS运行它没有运气。 Firefox运行得很好。 java中的代码如下所示:
private void start() {
Capabilities caps = new DesiredCapabilities();
((DesiredCapabilities) caps).setJavascriptEnabled(true);
((DesiredCapabilities) caps).setCapability("takesScreenshot", true);
((DesiredCapabilities) caps).setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "D:\\phantomjs-2.0.0-windows\\bin\\phantomjs.exe");
//WebDriver driver = new PhantomJSDriver(caps);
WebDriver driver = new FirefoxDriver();
driver.get("http://www.booking.com");
driver.findElement(By.id("destination")).sendKeys("Berlin");
//saveSShot(driver, "sel1.png");
long timeOut = 5000;
long end = System.currentTimeMillis() + timeOut;
while (System.currentTimeMillis() < end) {
if (String.valueOf(
((JavascriptExecutor) driver)
.executeScript("return document.readyState"))
.equals("complete")) {
break;
}
}
//saveSShot(driver, "sel2.png");
try {
//writeFile(driver, "output1.txt");
new WebDriverWait(driver, 3).until(ExpectedConditions.presenceOfElementLocated(By.cssSelector("ul.ui-autocomplete li a"))).click();
//writeFile(driver, "output2a.txt");
//saveSShot(driver, "sel3.png");
driver.findElement(By.name("idf")).click();
driver.findElement(By.className("b-searchbox-button")).submit();
List<WebElement> list = driver.findElements(By
.cssSelector("a.hotel_name_link"));
for (WebElement webElement : list) {
System.out.println(webElement.getText());
}
} catch (TimeoutException e) {
System.out.println(e.toString());
//writeFile(driver, "output.txt");
}
}
注意驱动程序的两个声明。如果我使用Firefox,WebDriverWait可以正常工作。在PhantomJS上,它给出了WebDriverWait的错误(未找到元素:262错误)
我添加了所有代码。您可以将其粘贴到新项目中,添加类和包含,然后您将看到它(不)的工作方式。必须编写两个注释方法saveSShot和writeFile。我用它们进行调试。我在第二个截图中看到的是&#34; Berlin&#34;实际上是写的,但ajax下拉不存在。有了Firefox,就会出现。
答案 0 :(得分:0)
这与ghostDriver无关:这是一个通用的WebDriver用例。您需要自己定义这样的场景,最有可能是通过在页面中注册一些JS来为您进行检查,并使用驱动程序来获取结果。您应该提供一种机制,等待显示和启用。等待页面的准备状态。这样简单的解决方案可以解决这个问题:
long timeOut = 5000;
long end = System.currentTimeMillis() + timeOut;
while (System.currentTimeMillis() < end) {
if (String.valueOf(
((JavascriptExecutor) driver)
.executeScript("return document.readyState"))
.equals("complete")) {
break;
}
}
我已经将ghostDriver用于丰富内容(游戏网站),并且它与所有AJAX都运行良好。
我做了一些研究,这也是我发现的工作:
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(5));
wait.Until(d => (bool)(d as IJavaScriptExecutor).ExecuteScript("return jQuery.active == 0"));
如果您决定继续使用JS代码,那么an article可以帮助您。