【问题标题】:Time out error when using browser.getCurrentUrl() after URL changesURL 更改后使用 browser.getCurrentUrl() 时出现超时错误
【发布时间】:2019-07-23 09:09:39
【问题描述】:

我正在为 AngularJS 应用程序的登录编写量角器测试,并想验证登录是否成功以及登录后 url 是否更改。我尝试将预期条件与 urlContains() 一起使用,也尝试与 browser.getCurrentUrl().toContain() 一起使用,但两者都出现错误。

exports.config = {

    seleniumAddress : 'http://localhost:4444/wd/hub', 
    specs: ['login.spec.js'],

    };

当 url 正确时,预期条件通过测试。但是当 url 不同时,它会抛出超时错误 “失败:等待 5013 毫秒后超时”。 expect(browser.getCurrentUrl()).toContain('/dashboard') 总是失败并出现以下错误

Stack:
    ScriptTimeoutError: script timeout: result was not received in 11 seconds
      (Session info: chrome=75.0.3770.142)
    Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:25:53'
    System info: os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.14.3', java.version: '12.0.1'
    Driver info: driver.version: unknown
        at Object.checkLegacyResponse (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/error.js:546:15)
        at parseHttpResponse (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/http.js:509:13)
        at doSend.then.response (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/http.js:441:30)
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:188:7)
    From: Task: Protractor.waitForAngular()
        at thenableWebDriverProxy.schedule (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/webdriver.js:807:17)
        at ProtractorBrowser.executeAsyncScript_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/built/browser.js:425:28)
        at angularAppRoot.then (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/built/browser.js:456:33)
        at ManagedPromise.invokeCallback_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:1376:14)
        at TaskQueue.execute_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:3084:14)
        at TaskQueue.executeNext_ (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:3067:27)
        at asyncRun (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:2927:27)
        at /Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/selenium-webdriver/lib/promise.js:668:7
        at <anonymous>
        at process._tickCallback (internal/process/next_tick.js:188:7)
    From: Task: Run it("should login successfully") in control flow
        at UserContext.<anonymous> (/Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/jasminewd2/index.js:94:19)
    From asynchronous test: 
    Error
        at Object.<anonymous> (/Users/ProtractorTest/Tests/login.spec.js:17:3)
        at Module._compile (module.js:643:30)
        at Object.Module._extensions..js (module.js:654:10)
        at Module.load (module.js:556:32)
        at tryModuleLoad (module.js:499:12)
        at Function.Module._load (module.js:491:3)
        at Module.require (module.js:587:17)
        at require (internal/module.js:11:18)
        at /Users/.nvm/versions/node/v8.9.4/lib/node_modules/protractor/node_modules/jasmine/lib/jasmine.js:93:5

下面是我的代码

it('should login successfully', function () {
  browser.get("https://example.com/");
  loginobj.username.sendKeys(logindata.email);
  loginobj.password.sendKeys(logindata.password);
  loginobj.loginbtn.click().then(function(){
  browser.getCurrentUrl().then(url => expect(url).toContain('/dashboard'));
  //var EC = protractor.ExpectedConditions;
  //browser.wait(EC.urlContains('/dashboard'), 5000);  
})

我希望当 url 与预期的不同时,它应该显示有效的错误消息而不是超时错误。

【问题讨论】:

  • 尝试做expect(true).toBe(true),如果失败请告诉我。只是想消除 webdriver 问题。

标签: protractor assertion


【解决方案1】:

默认情况下,量角器会为您处理所有异步操作。查看您的代码,您依赖于默认量角器行为,即未将 SELENIUM_PROMISE_MANAGER 设置为 false

既然如此,你为什么要在click().then()里面做点什么?它可以简单明了

loginobj.loginbtn.click(); expect(browser.getCurrentUrl()).toContain('/dashboard');

您的代码的一个理论:一旦您在click().then() 中有一些东西,它就与量角器正在为您处理的承诺队列格格不入。除非绝对必要,例如从元素中获取值以供以后在规范中使用,我建议不要尽可能多地干预量角器异步处理。

希望对您有所帮助。

【讨论】:

    【解决方案2】:

    我也有类似的

    const currentUrl = await browser.getCurrentUrl().then(url => url);
    expect(currentUrl).toContain('/dashboard')
    

    试试看也许会有所帮助,只是没有等待,因为我看到你不使用异步函数

    或者像这样

    await browser.getCurrentUrl().then(url => expect(url).toContain('/dashboard'));
    

    【讨论】:

    • 我将测试更新如下。但我收到“意外标识符”错误it('should login successfully', async () =&gt; { browser.get("https://pdtest.gan-compliance.com/"); loginobj.username.sendKeys(logindata.email); loginobj.password.sendKeys(logindata.password); loginobj.loginbtn.click().then(()=&gt; { const currentUrl = await browser.getCurrentUrl().then(url =&gt; url); await expect(currentUrl).toContain('/dashboard') });
    • 在将 2 种方法合二为一时,不要等待,也可以尝试类似 browser.getCurrentUrl().then(url =&gt; expect(url).toContain('/dashboard')); 如果您使用异步功能,那么您必须在每个 loginobj 步骤中使用等待
    • 我尝试过不使用 await,也尝试过使用 aync 和 await。我收到错误“失败:脚本超时:在 11 秒内未收到结果并提供构建信息、系统信息和驱动程序信息:驱动程序版本:未知。”在这两种情况下
    • @jane 您能否从堆栈跟踪中提供有关错误以及您正在测试的应用程序的更多信息。它是角度/其他 fw,您的量角器配置也很高兴看到。请为此编辑主要帖子。起初我认为这可能是量角器同步的错误,但似乎有所不同。
    • 更新了帖子。非常感谢您的帮助。
    【解决方案3】:

    在量角器中默认脚本超时为 11 秒, 在上面的代码sn-p中,

    browser.getCurrentUrl().then(url => expect(url).toContain('/dashboard'));
    

    statement 需要超过 11 秒才能解决 promise。

    解决方案:在 Protractor 配置文件中,添加以下语句 allScriptsTimeout: timeout_in_millis。 例如 30 秒超时

    allScriptsTimeout: 30000
    

    编辑的配置文件:

    exports.config = {
    allScriptsTimeout: 30000,
    seleniumAddress : 'http://localhost:4444/wd/hub', 
    specs: ['login.spec.js'],
    

    };

    【讨论】:

    • 我在配置文件中添加了 allScriptsTimeout: 30000, 但我仍然收到超时错误。登录不需要很长时间。看起来由于某种原因它没有获取 URL。我收到错误“失败:脚本超时:30 秒内未收到结果”
    • 您是否尝试使用量角器自动化非钓鱼网站?
    • 这是一个有角度的网站。
    • 请参阅下面的链接,了解量角器中所有类型的超时。链接:protractortest.org/#/timeouts。这可能会有所帮助。
    猜你喜欢
    • 1970-01-01
    • 2016-04-12
    • 2018-11-27
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多