【问题标题】:Selenium WebDriver - waiting for angular requests(Java)Selenium WebDriver - 等待角度请求(Java)
【发布时间】:2018-01-07 20:58:03
【问题描述】:

我正在为基于 Angular 的应用程序创建测试,我需要帮助。 我必须创建一个等待,直到所有待处理的请求都被处理。 基本上在我的场景中,我想标记一个复选框,但它仅在 GET 请求完成时可用,如果我使用简单的Thread.sleep(2000) 一切正常,但我知道这不是解决这个问题的可靠方法。 我尝试了两种方法:

第一:

   AdditionalConditions wait = new AdditionalConditions();
        wait.untilAngularFinishHttpCalls();



 public void untilAngularFinishHttpCalls() {
        final String javaScriptToLoadAngular =
                "var injector = window.angular.element('app-root').injector();" +
                        "var $http = injector.get('$http');" +
                        "return ($http.pendingRequests.length === 0)";

        ExpectedCondition<Boolean> pendingHttpCallsCondition = new ExpectedCondition<Boolean>() {
            public Boolean apply(WebDriver driver) {
                return ((JavascriptExecutor) driver).executeScript(javaScriptToLoadAngular).equals(true);
            }
        };
        WebDriverWait wait = new WebDriverWait(SharedDriver.getDriver(), 20); // timeout = 20 secs
        wait.until(pendingHttpCallsCondition);
    }

在这里我得到以下错误:

org.openqa.selenium.WebDriverException:未知错误:无法读取 未定义的属性“元素”(会话信息:chrome=59.0.3071.115)
(驱动信息:chromedriver=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8),平台=Windows NT 10.0.15063 x86_64)(警告:服务器未提供任何堆栈跟踪信息)命令持续时间或超时:5 毫秒构建信息: 版本:'2.31.0',修订: '1bd294d185a80fa4206dfeab80ba773c04ac33c0',时间:'2013-02-27 13:51:26' 系统信息:os.name:'Windows 10',os.arch:'amd64', os.version: '10.0', java.version: '1.8.0_121' 驱动信息: org.openqa.selenium.chrome.ChromeDriver 功能 [{applicationCacheEnabled=false, 可旋转=false, mobileEmulationEnabled=false,networkConnectionEnabled=false, 铬={铬驱动程序版本=2.31.488763 (092de99f48a300323ecf8c2a4e2e7cab51de5ba8), userDataDir=C:\Users\lpaczek\AppData\Local\Temp\scoped_dir13872_15975}, 需要HeapSnapshot=true,pageLoadStrategy=正常, databaseEnabled=false,handlesAlerts=true,hasTouchScreen=false, 版本=59.0.3071.115,平台=XP,browserConnectionEnabled=false, nativeEvents=true,acceptSslCerts=true,locationContextEnabled=true, webStorageEnabled=true,browserName=chrome,takeScreenshot=true, javascriptEnabled=true, cssSelectorsEnabled=true, setWindowRect=true, 意外警报行为=}]

我也试过了:

   WebDriverWait wait = new WebDriverWait(SharedDriver.getDriver(), 15, 500);
        wait.until(AdditionalConditions.angularHasFinishedProcessing());


public class AdditionalConditions {
    public static ExpectedCondition<Boolean> angularHasFinishedProcessing() {
        return new ExpectedCondition<Boolean>() {
            @Override
            public Boolean apply(WebDriver driver) {
                return Boolean.valueOf(((JavascriptExecutor)
                        driver).executeScript("return (window.angular !== undefined) && (angular.element(document).injector() !== undefined) && (angular.element(document).injector(). get('$http').pendingRequests.length === 0)").toString());
            }
        };
    }

在这里我在 15 秒后超时。似乎它不起作用。 如果可以,请提供帮助,据我所知,我需要执行 JavaScript 代码,而且我是新手。

【问题讨论】:

  • 我们可以单独处理所有隐式等待,而不是为每个角度调用添加显式等待吗?

标签: javascript java angularjs selenium automated-tests


【解决方案1】:

你可以等待 Angular 完成它的工作

ngwebDriver 包将为您提供这种能力

var driver = new NgWebDriver(driver);

driver.waitForAngularRequestsToFinish();

【讨论】:

  • 我已将其添加到我的代码中,我得到“org.openqa.selenium.ScriptTimeoutException:异步脚本超时:15 秒内未收到结果”为什么?当我手动测试时,请求会在 ~6 秒后处理
  • 这是特定于应用程序的......无法从问题中看出
猜你喜欢
  • 2018-08-20
  • 1970-01-01
  • 2018-01-13
  • 1970-01-01
  • 2016-12-25
  • 2014-04-04
  • 1970-01-01
  • 1970-01-01
  • 2016-07-28
相关资源
最近更新 更多