Подтвердить что ты не робот

Транспортир + хромовый драйвер: элемент не может быть нажат в точке

Привет, у меня есть некоторые проблемы с получением базового теста транспортира.

Моя настройка:

  • Я использую requirejs, поэтому инициализирую angular с помощью angular.bootstrap(), а не ng-app attr. Согласно документам транспортира, это не поддерживается из коробки, но, похоже, отлично работает для тестов, которые не включают щелчок.
  • Транспортир conf.json:

    "use strict";
    exports.config = {
        specs: '../E2ETests/**/*.js',
        chromeOnly: true,
        getPageTimeout: 30000,
        allScriptsTimeout: 30000
    }
    
  • Я использую некоторые сторонние прошивки jquery, которые я переношу в директивы, я подозреваю, что это может быть частью проблемы.

Тест:

"use strict";
describe('When clicking should add stuff', function () {
    var ptor;
    beforeEach(function () {
        browser.get('https://localhost/myApp');
        ptor = protractor.getInstance();
    });
    it('add stuff', function () {
        // If I comment this, the test pass. 
        element(by.id('add-stuff-button')).click();
        // This does not matter fails on the line above..
        expect(browser.getTitle()).toBeDefined();
    });
});

Ошибка:

UnknownError: unknown error: Element is not clickable at point (720, 881). Other element would         receive the click: <div class="col-md-5 col-md-offset-5">...</div>
(Session info: chrome=37.0.2062.124)
(Driver info: chromedriver=2.10.267521,platform=Windows NT 6.1 SP1 x86_64)

Мысли

Хромидра найдет кнопку, потому что, если я изменю идентификатор, он жалуется, что ни один элемент не найден. Поэтому я думаю, что проблема в том, что кнопка перемещается из своего исходного положения. Поскольку функция element (***) должна ждать завершения angular, я подозреваю, что ее сторонние плагины могут помешать, поскольку они могут не использовать angular api для получения данных и т.д. Таким образом, angular считает, что это сделано но затем сторонний штепсель заполняет и перемещает вещи вокруг.

Любые идеи, что делать? Если проблема связана с сторонними заглушками, могу ли я как-то сказать angular, что происходит третья сторона, а потом позже расскажет об этом, когда она будет выполнена?

спасибо бром Twd

4b9b3361

Ответ 1

Вы должны установить размер окна в файле конфигурации

onPrepare: function() {
  browser.manage().window().setSize(1600, 1000);
}

Ответ 2

Следующее работало нормально для меня:

browser.actions().mouseMove(element).click();

Редактировать: Если вышеописанное не работает, попробуйте также метод chaining execute() (я получил это как предложение по редактированию, я не проверял его, но кто-то мог проверить это и прокомментировать)

browser.actions().mouseMove(element).click().perform();

Ответ 3

Это происходит, если окно хрома слишком мало, попробуйте добавить внутри beforeEach

browser.driver.manage().window().setSize(1280, 1024);

Ответ 4

Или просто используйте класс Actions:

browser.actions().mouseMove(elem).click().perform();

Ответ 5

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

Это сообщение уведомления о подключении к браузеру, отправленное браузерами, запущенном Gulp. Сообщение исчезло через короткое время, но после моего вызова onClick().

Чтобы удалить уведомление, в моем gulpfile я добавил параметр notify: false при инициализации браузера:

browserSync.init(files, {
    server: {
        baseDir: "dist",
        index: "index.html"
    },
    notify: false
});

Ответ 6

Я исправляю эту проблему, используя время сна браузера.

browser.driver.sleep(3000)

перед нажатием кнопки

Ответ 7

Имел ту же проблему, но не был связан с размером окна, но должен был ждать завершения ngAnimation.

Поэтому мне пришлось ждать, пока элемент будет доступен для клика.

    const msg = 'Waiting for animation timeout after 1s';
    const EC  = new protractor.ProtractorExpectedConditions();
    await browser.wait(EC.elementToBeClickable(model.elements.button.checkCompliance), 1000, `${msg} panel`);
    await model.elements.button.checkCompliance.click();

@note - Я использую функцию async/await node 8, вы можете просто преобразовать ее в обычный Promises. Также используйте ProtractorExpectedConditions вместо ExpectedConditions см. Документацию

Ответ 8

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

При дальнейшей проверке казалось, что другой элемент скрывает кнопку, поэтому тест Selenium не удался, потому что кнопка не была нажата (и не может быть). Возможно, поэтому, почему настройка размера экрана исправляет его для некоторых?

Какая фиксированная шахта удаляет другой элемент (и затем корректирует его положение).

Ответ 9

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

browser.manage().window().maximize();

Ответ 10

Вы также можете попробовать отключить любые инструменты отладки, которые вы могли бы использовать. Я использовал Laravel и debugbar и должен был установить APP_DEBUG на false.

Ответ 11

От Gal Malgarit ответьте,

Вы должны установить размер окна в файле конфигурации

onPrepare: function() {
  browser.manage().window().setSize(1600, 800);
}

Если он все еще не работает, вы должны прокрутить до местоположения элемента

browser.executeScript('window.scrollTo(720, 881);');
element(by.id('add-stuff-button')).click();

Ответ 12

Другой способ: вы можете попробовать следующее:

this.setScrollPage = function (element) {

    function execScroll() {
        return browser.executeScript('arguments[0].scrollIntoView()',
            element.getWebElement())
    }

    browser.wait(execScroll, 5000);
    element.click();
};

Ответ 13

Обратите внимание, что это когда-то было вызвано верхней навигационной панелью или нижней навигационной панелью/предупреждающей панелью cookie, охватывающей элемент. С помощью angular 2 при нажатии на нее прокручивается, пока элемент не будет только на странице. Это означает, что при прокрутке вниз, чтобы щелкнуть что-либо, если есть нижняя навигация, это будет затруднять щелчок. Аналогично, при прокрутке вверх он может быть покрыт верхней навигацией.

Теперь, чтобы обойти прокрутку, я использую следующее:

browser.refresh();
browser.driver.sleep(3000);

Я убедился, что удалил нижний план, щелкнув, чтобы закрыть его до начала теста.

Ответ 14

Вы можете определить желаемое разрешение экрана через файл конфигурации транспортира (например, protractor.conf.js или config.js) для согласованного поведения при тестировании.

Например, с браузером Chrome:

exports.config = {
  specs: [
    // ...
  ],
  capabilities: {
    browserName: 'chrome',
    chromeOptions: {
      args: [
        '--window-size=1600,900',
        '--headless'
      ]
    }
  }
  // ...
}

Пояснения

  • Аргумент window-size запустит Chrome с окном 1600 на 900.
  • headless запустит Chrome без головы, что позволит вам запускать тесты с указанным размером окна (1600 на 900), даже если разрешение экрана ниже этого.

Возможно, вы захотите иметь две конфигурации: одну для разработчиков (без режима без головы), у которых всегда есть экран с высоким разрешением, и другую для серверов сборки (без монитора), где разрешение экрана иногда остается загадкой и может быть ниже, чем у вашего приложения/теста. предназначен для. Файл конфигурации транспортира - javascript и может быть расширен, чтобы избежать дублирования кода.