После входа на мой веб-сайт транспортир не может найти следующий элемент

Этот код для пользователя после входа в систему должен опубликовать приветственное сообщение.

describe("launching Telekha",function(){
    it("navigating to signin page",function(){
        browser.get("www");
        element(by.model("credentials.email")).sendKeys("[email protected]");
        element(by.model("credentials.password")).sendKeys("123456");
        var ptr = element( by.css('[ng-click="login()"]') );
        ptr.click();
        });

    it("on dashboard",function(){
        element(by.model("post.postText")).sendKeys("hello");
            element( by.css('[ng-click="postit()"]') ).click();
        });
});

HTML-код для кнопки

<textarea id="post-editor" placeholder="Tell your friends" ng-model="post.postText" class="textareanoborder col-xs-12 col-md-12 ng-pristine ng-valid ng-isolate-scope ng-touched" autocomplete="off" aria-invalid="false"> </textarea>

person Ajay    schedule 21.11.2016    source источник
comment
какая ошибка вылетает?   -  person radio_head    schedule 21.11.2016
comment
Вы добавили ignoreSynchronization = true; где-нибудь, @Ajay?   -  person Tom Nijs    schedule 22.11.2016
comment
Нет. требуется @TomNijs   -  person Ajay    schedule 22.11.2016
comment
Мне просто интересно, что может привести к тому, что ваш транспортир не смог синхронизироваться...   -  person Tom Nijs    schedule 22.11.2016
comment
Спасибо @Tom, это разрешилось с помощью browser.ignoreSynchronization = true;   -  person Ajay    schedule 22.11.2016


Ответы (2)


Это предположение, но по опыту оно обычно не за горами. Когда страница, на которую вы переходите, загружается, могут ли происходить какие-либо анимации, запросы AJAX или другие задержки, отличные от AngularJS? Транспортир их не ждет и выполнит код:

element(by.model("post.postText")).sendKeys("hello");

как только сможет. Если при этом все анимации еще не были завершены, ваш элемент не будет виден транспортиру, и вы увидите ошибку, с которой столкнулись.

Чтобы быстро проверить это, добавьте browser.sleep(10000); перед строкой, в которой происходит сбой. browser.sleep(); — это команда, которая заставит браузер ждать определенное время, в данном случае 10 000 миллисекунд (10 секунд).

Если это сработает, вы можете изменить его на что-то более элегантное, например:

browser.wait(function() {
  return element(by.model("post.postText")).isPresent();
}, 10000);

Который будет ждать, пока ваш элемент станет видимым, но только максимум 10 секунд, после чего все равно продолжится.

EDIT1: (что работает нормально):

HTML (обслуживание с http://localhost:8080)

<!DOCTYPE html>
<html>
    <head>
        <meta charset="utf-8">
        <title>Example</title>
        <script src="bower_components/angular/angular.min.js"></script>
        <script>
        var app = angular.module('app', []);
        app.controller('myCtrl', function($scope) {
        });
    </script>
</head>
    <body ng-app="app" ng-controller="myCtrl">
         <textarea id="post-editor" placeholder="Tell your friends" ng-model="post.postText" class="textareanoborder col-xs-12 col-md-12 ng-pristine ng-valid ng-isolate-scope ng-touched" autocomplete="off" aria-invalid="false"> </textarea>
    </body>
</html>

spec.js

describe('angularjs homepage todo list', function() {
  it('should add a todo', function() {
    browser.get('http://localhost:8080');
    $("#post-editor").sendKeys("testlol");
    browser.sleep(2000);
  });
});

conf.js

exports.config = {
  seleniumAddress: 'http://localhost:4444/wd/hub',
  specs: ['spec.js']
};
person Tom Nijs    schedule 21.11.2016
comment
Спасибо за информацию, у меня есть служебный запрос на вход и отправку текста. @Tom - person Ajay; 21.11.2016
comment
Исправлено ли добавление строки browser.sleep()? - person Tom Nijs; 21.11.2016
comment
Нет.пожалуйста, помогите мне out@Tom - person Ajay; 21.11.2016
comment
Что еще вы пробовали? Вы дважды проверили селекторы элементов на наличие опечаток, проверили ли вы, сколько времени занимает ваш запрос на обслуживание и когда именно ваш тест транспортира дает сбой? - person Tom Nijs; 21.11.2016
comment
Функция browser.wait() отлично выполняется, когда sendKeys(hello) модели не находит элемент - person Ajay; 21.11.2016
comment
Я пробовал все способы, он выполняет все шаги, которые я отправляю, но проблема в том, что он не отправляет ключи в браузер, например sendKeys (привет) - person Ajay; 22.11.2016
comment
Ваш элемент внутри iFrame? И, как упомянул @SureshSalloju, включите соответствующий HTML-код. - person Tom Nijs; 22.11.2016
comment
‹textarea id=post-editor placeholder=Расскажи своим друзьям -invalid=false› ‹/textarea› - person Ajay; 22.11.2016
comment
В заголовке вашего вопроса говорится, что невозможно найти элемент. Это сообщение об ошибке, которое вы получаете, или в нем говорится, что невозможно сфокусировать элемент? - person Tom Nijs; 22.11.2016
comment
столкнулся со следующей ошибкой @Tom Failed: истекло время ожидания синхронизации Protractor со страницей через 50 секунд. См. github.com/angular/protractor/blob/master/docs/ faq.md При ожидании элемента с локатором - Локатор: By(селектор css, *[id=post-editor]). Предстояли следующие задачи: - person Ajay; 22.11.2016

Вы можете реализовать метод protractor.ExpectedConditions.visibilityOf(), чтобы дождаться, пока элемент станет видимым в пользовательском интерфейсе, а затем отправить данные в поле ввода.

    var EC=protractor.ExpectedConditions;

    it("on dashboard",function(){
       var ele=element(by.id("post-editor"));
       browser.wait(EC.visibilityOf(ele),8000,'Ele is not presented');
       ele.sendKeys("hello");
       element( by.css('[ng-click="postit()"]') ).click();
    });
person Optimworks    schedule 21.11.2016
comment
Ошибка: истекло время ожидания синхронизации Protractor со страницей через 50 секунд. См. github.com/angular/protractor/blob/master/docs/ faq.md При ожидании элемента с локатором - Локатор: by.model(post.postText). - $timeout: функция (){i(b)} - $timeout: функция (){i(b)} - $timeout: функция (){i(b)} - $timeout: функция (){i(b)} )} - $timeout: function (){i(b)} - $timeout: function c(){var b=a.data(sa);if(b){for(var c=1;c‹b. длина; c++)b[c]();a.removeData(sa)}} - $timeout: function c(){var b=a.data(sa);if(b){for(va - person Ajay; 21.11.2016
comment
если увеличить время ожидания тоже выдает ошибку - person Ajay; 21.11.2016
comment
@Ajay, можно проверить, в каком теге размещена директива ng-app? (либо в login.thml, либо в index.html) - person Optimworks; 21.11.2016
comment
это в index.html - person Ajay; 21.11.2016
comment
в каком теге находится «ng-app»? находится в ‹html› или ‹body› или любом другом теге - person Optimworks; 21.11.2016
comment
в теге тела есть какие-либо проблемы? если я помещу его в тело - person Ajay; 21.11.2016
comment
Транспортир по умолчанию ищет ng-app в теге body. Если ng-app не в теле, вы получите эту ошибку. Его можно установить вручную. но в вашем случае это не проблема. можете ли вы добавить browser.sleep(8000) после входа в систему. - person Optimworks; 21.11.2016
comment
он выполняет шаги отлично, но не может отправить сообщение. я имею в виду, что то, что я отправляю, невозможно показать. я отправляю сообщение sendKeys (привет). @suresh - person Ajay; 22.11.2016
comment
Можете ли вы поместить HTML-код, относящийся к этому полю ввода? - person Optimworks; 22.11.2016
comment
‹textarea id=post-editor placeholder=Расскажи своим друзьям -invalid=false› ‹/textarea› - person Ajay; 22.11.2016
comment
Ошибка: истекло время ожидания синхронизации Protractor со страницей через 50 секунд. См. github.com/angular/protractor/blob/master/docs/ faq.md При ожидании элемента с локатором - Локатор: By(селектор css, *[id=post-editor]). Ожидались следующие задачи: \ ScriptTimeoutError: тайм-аут асинхронного сценария: результат не был получен в течение 50 секунд (информация о сеансе: chrome=54.0.2840.99) (информация о драйвере: chromedriver=2.25.426923 (0390b88869384d6eb0d5d09729679f934aab9eed), платформа = 2 спецификации, 1 ошибка Закончено за 68,389 секунды. - person Ajay; 22.11.2016
comment
Спасибо за помощь @suresh - person Ajay; 22.11.2016
comment
@ Аджай, позвоним нам в 19:00 по восточному поясному времени. я могу помочь решить это - person Optimworks; 22.11.2016