为什么量angular器立即运行每一行代码?

为什么量angular器立即运行每一行代码?

所以我有一个不是写在angular度的网页。 我需要基于selenium的自动化。 我用seleniumwebdriver-js代码来打它。 下面的例子。 一旦你login,你会被带到一个有3个问题的页面。 每次login时问题的顺序都是随机的。 因此,每次login时,您都可能不会以相同的顺序得到相同的问题。

问题1)你叫什么名字?

问题2)现在几点了?

问题3)你在这里?

每个问题的答案都是问题的最后一个字。

答案1)名称

答案2)它

答案3)在这里

所以我想一个简单的方法来解决这个问题是创build一个if条件语句

var foo = browser.driver.findElement(By.id('question1')).getText(); if(foo == What is your name?) { browser.driver.findElement(By.id('answer1')).sendKeys('name'); } else { blah } 

等等…等等…

但是我遇到的问题是,在它到达那个点之前,Protractor立即运行if语句。 在下面的示例中,控制台会立即打印出控制台日志“this sucks”,因为它会立即运行if语句,而不会经过第一步到达页面然后检查。

  this.foo_test = function() { console.log('starting foo test'); browser.driver.get('http://my-test-url.com/'); browser.sleep(3000); browser.driver.findElement(By.id('login')).click(); browser.sleep(3000); browser.driver.findElement(By.id('user')).sendKeys('user'); browser.driver.findElement(By.id('login_button')).click(); browser.sleep(3000); console.log('getting variable'); var foo = browser.driver.findElement(By.id('question1')).getText(); console.log(foo); if (foo == 'What was the name of your first pet?') { console.log('this is cool'); } else{ console.log('this sucks'); } }; 

       

网上收集的解决方案 "为什么量angular器立即运行每一行代码?"

量angular器build立在WebdriverJS的基础上,它使用隐式的承诺排队风格的编程。 看到:

https://github.com/angular/protractor/blob/master/docs/control-flow.md

这意味着量angular器testing中的每一个陈述都应该被理解为排列一个承诺,而不是实际执行。 所以例如,行:

 browser.driver.findElement(By.id('question1')).getText() 

返回文本,但返回承诺返回文本。 你必须将这个承诺传递给其他期望的API,或者使用.then()提供一个直接的处理程序。

您在量angular器testing中看到的expect调用已被修改为等待解决的承诺。 所以像这样:

 expect(name.getText()).toEqual('Jane Doe'); 

实际上实现了将左边承诺的结果与右边的价值进行比较的承诺。

我不太了解有关量angular器的知识,但这听起来像是不识别asynchronous代码的问题。 如果第一个赋值语句是asynchronous的,那么剩下的代码将不会等待它完成。 因此,当您尝试在IF语句中testing它们时,您所期望的值将不会在那里。

最好的办法是在callback或承诺中运行其余的代码。

即使selenium认为它是完整的,看起来你的页面仍然在加载。 这种情况发生在dynamic/asynchronous页面上。

browser.sleep()不是很合适,你永远不知道你需要等待多久。

您可以调查WebDriverWait类,它允许您等待元素出现或超时。

 Wait<WebDriver> wait = new WebDriverWait(driver, 50); // timeout is 50 secs wait.until(new Function<WebDriver, Boolean>() { public Boolean apply(WebDriver driver) { return (driver.findElement(By.id('question1'))).isDisplayed(); } }); 

您也可以尝试运行一些JavaScript来检查文档就绪状态:

 Wait<WebDriver> wait = new WebDriverWait(driver, 60); // timeout is 60 secs wait.until(new Function<WebDriver, Boolean>() { public Boolean apply(WebDriver driver) { String docReady = ""; Boolean rc = true; if (null != ((RemoteWebDriver)driver).getSessionId()) { docReady = String.valueOf(((JavascriptExecutor) driver).executeScript("return document.readyState")); rc = docReady.equals("complete"); } return rc; } });