1

Почему Transractor запускает каждую строку кода немедленно?Почему Transractor запускает каждую строку кода немедленно?

У меня есть веб-страница, которая не написана в угловом формате. Мне нужна моя автоматизация на основе селена. Я использовал код selenium webdriver-js, чтобы поразить его. Пример ниже. После входа в систему вы попадаете на страницу с тремя вопросами. Порядок вопросов рандомизируется каждый раз при входе в систему. Таким образом, вы никогда не сможете получать одни и те же вопросы в том же порядке каждый раз, когда вы входите в систему.

Вопрос 1) Как вас зовут?

Вопрос 2) Сколько сейчас времени?

Вопрос 3) Вы здесь?

Ответы на каждый вопрос являются последним словом вопроса.

Ответ 1) Имя

ответа 2) он

Ответ 3) здесь

Так что я думал, простой способ решить эту проблему, чтобы создать, если условный оператор

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 
} 

и пр. ... и т. Д.

Но эта проблема m Я нахожусь в том, что Protractor немедленно запускает оператор if до того, как он доберется до этой точки. В приведенном ниже примере консоль немедленно распечатывает журнал консоли «это отстой», потому что она выполняется через оператор 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'); 
     } 
    }; 

ответ

0

Я не очень разбираюсь в протрактор, но это звучит как проблема не распознавания асинхронного кода. Если первый оператор присваивания является асинхронным, остальная часть кода будет работать, не дожидаясь его завершения. Следовательно, ожидаемых значений не будет, если вы попытаетесь проверить их в инструкции IF.

Лучше всего использовать остальную часть кода в обратном вызове или обещании.

0

Похоже, что ваша страница по-прежнему загружается, хотя селен считает, что она завершена. Это происходит с динамическими/асинхронными страницами.

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; 
    } 
}); 
3

транспортира основывается на WebdriverJS, которая использует стиль неявного обещания-массовое обслуживание программирования.См:

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

Что это означает, что каждое утверждение в тесте транспортир следует читать как enqueuing обещание, а не как на самом деле выполнения. Так, например, линия:

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

ли не возврата текста, но возвращает обещание вернуть текст. Вы должны передать это обещание другим ожидающим API API или предоставить прямой обработчик .then().

expect звонок, который вы видите в испытаниях Protractor, был изменен, чтобы дождаться разрешения на обещание. Так что-то вроде:

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

фактически enqueuing обещания сравнить результат обещания слева на значение справа.