【问题标题】:Phantomjs' selenium Ajax code not loadedPhantomjs 的 selenium Ajax 代码未加载
【发布时间】:2015-08-05 21:57:26
【问题描述】:

我刚刚发现了 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。我将它们用于调试目的。我在第二个屏幕截图中看到的是“Berlin”实际上是写的,但是没有 ajax 下拉菜单。在 Firefox 中出现。

【问题讨论】:

  • 你有没有截屏看看你是否在正确的页面上?是否打印了页面源代码来查看元素是否存在?
  • @mobinoob 我在更改应该触发 ajax 调用但不会触发的选择时遇到了一些类似的问题。该错误仅发生在 PhantomJS 上,而不是 Firefox 上。当我们检查 selectByValue 之前和之后的屏幕截图问题时,看起来选择没有发生。您应该按照 Artjom B. 的建议检查屏幕截图和来源
  • @ArtjomB。我确实在 SendKeys 之后检查了源代码,但没有看到任何
  • 。我也没有在文本框中找到“柏林”,但我不应该看到,对吧?我会尝试截图
  • @JeskoR。你发现原因了吗?我可能会使用 ByClassname 而不是 By.id 并再试一次
  • @JeskoR。 By.Id 完美运行。我在屏幕截图上看到“柏林”。如果您愿意,可以测试我的代码。现在都在那里。
  • 标签: java selenium selenium-webdriver phantomjs


    【解决方案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 可以帮助您。

    【讨论】:

    • WebDriverWait 除外,而不是您显示的 findElement。它也不能是通用的,因为它适用于 Firefox,但不适用于 PhantomJS。无论如何,我会在 WebDriverWait 之前尝试你的等待循环。
    • 等待循环不影响它。它立即继续。截图显示下拉菜单根本没有出现。
    • @ekostadinov 我尝试了相当多的工作,但是当 ajax 调用正在进行时,文档就绪状态不会改变。我认为如果页面重新加载会有所不同,但这首先会破坏 ajax 调用的目的。你介意举一个更完整的例子吗?
    • 就像我说的,这是适用于我的解决方案。我已经使用新代码 sn-p 进行了一些尝试 - 请参阅我的更新答案。
    • @ekostadinov 我已将您的代码转换为 java,但仍然没有运气。 Phantomjs 绝对不使用 Ajax,否则我的测试截图会有所不同(我们没有你的代码)
    猜你喜欢
    相关资源
    最近更新 更多
    热门标签