有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java Phantomjs的selenium Ajax代码未加载

我刚刚发现了Selenium,我正在尝试学习如何在PhantomJS中使用它。我发现的第一个例子是关于从预订中获取链接列表。通用域名格式。 我试着用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");
    }
}

注意driver的两个声明。如果我使用Firefox,WebDriverWait就会工作。在PhantomJS上,它给出了一个WebDriverWait错误(未找到元素:262错误)

我已经添加了所有代码。您可以将它粘贴到一个新项目中,添加类和include,然后您将看到它是如何工作的。必须写入两个带注释的方法saveSShot和writeFile。我使用它们进行调试。我在第二个屏幕截图上看到的是,“柏林”实际上是写好的,但是ajax下拉列表不在那里。在Firefox中,它出现了


共 (1) 个答案

  1. # 1 楼答案

    这与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可以帮助您