Protractor URL更改后使用browser.getCurrentUrl()时出现超时错误

Protractor URL更改后使用browser.getCurrentUrl()时出现超时错误,protractor,assertion,Protractor,Assertion,我正在为AngularJS应用程序的登录编写一个量角器测试,并希望验证登录是否成功,以及登录后url是否更改。我尝试使用urlContains()的预期条件,也尝试使用browser.getCurrentUrl().toContain()的预期条件,但两者都出现了错误 exports.config = { seleniumAddress : 'http://localhost:4444/wd/hub', specs: ['login.spec.js'], }; u

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

exports.config = {

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

    };
url正确时,预期条件通过测试。但是当url不同时,它会抛出超时错误 “失败:等待在5013ms后超时”。 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


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

我有类似的想法

const currentUrl = await browser.getCurrentUrl().then(url => url);
expect(currentUrl).toContain('/dashboard')
试试看,也许会有帮助,只是不用等待,因为我看到你不使用异步函数

还是像这样

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

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

browser.getCurrentUrl().then(url => expect(url).toContain('/dashboard'));
语句需要11秒以上的时间来解析承诺

解决方案:在量角器配置文件中,添加以下语句
allScriptsTimeout:timeout(以毫秒为单位)
。 e、 g为30秒超时

allScriptsTimeout: 30000
编辑的配置文件:

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

})

默认情况下,量角器为您处理所有异步。查看您的代码,您依赖于默认的量角器行为,即未将
SELENIUM\u PROMISE\u MANAGER
设置为
false

在这种情况下,为什么要在
单击()中执行某些操作。然后()
?它可以简单明了

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

关于代码的一个理论是:一旦您在
click()中找到了某个内容,那么()
,它就不适合于量角器为您处理的承诺队列。除非是绝对必要的,否则对于从元素中获取值以供以后在规范中使用,我建议尽量不要干预量角器异步处理


希望有帮助。

我更新了测试,如下所示。但是我得到了“意外标识符”错误
it('should login successfully',async()=>{browser.get('https://pdtest.gan-compliance.com/“”;loginobj.username.sendKeys(loginda.email);loginobj.password.sendKeys(loginda.password);loginobj.loginbtn.click()。然后(()=>{const currentUrl=wait browser.getCurrentUrl()。然后(url=>url);wait-expect(currentUrl).toContain('/dashboard')});
在一个it中混合使用两种方法时,不要等待,也可以尝试以下方法
browser.getCurrentUrl()。然后(url=>expect(url).toContain('/dashboard'));
如果使用异步函数,则必须在每个loginobj步骤中使用wait。我尝试了不使用wait,也尝试了使用aync和wait。我收到错误“失败:脚本超时:11秒内未收到结果,并提供生成信息、系统信息和驱动程序信息:驱动程序。版本:未知。”在两方面cases@jane你能从stacktrace提供更多关于错误的信息,以及关于你正在测试的应用程序的信息吗?是angular/other fw吗?还有你的量角器配置很好。请编辑这篇文章。起初我认为这可能是量角器同步的错误,但看起来有些不同。更新了文章。我真的很高兴感谢你的帮助。试着去做
expect(真的)。toBe(真的)
如果失败,请告诉我。我只是想消除webdriver问题。我在配置文件中添加了allScriptsTimeout:30000,但我仍然收到超时错误。登录不需要很长时间。由于某种原因,它似乎无法获取URL。我收到错误“失败:脚本超时:30秒内未收到结果”是否尝试aut使用量角器的omate非anguler网站?这是一个有角度的网站。有关量角器中所有类型的超时,请参阅下面的链接。链接:。可能会有所帮助。
exports.config = {
allScriptsTimeout: 30000,
seleniumAddress : 'http://localhost:4444/wd/hub', 
specs: ['login.spec.js'],