Ответ 1
Вы должны установить размер окна в файле конфигурации
onPrepare: function() {
browser.manage().window().setSize(1600, 1000);
}
Привет, у меня есть некоторые проблемы с получением базового теста транспортира.
Моя настройка:
Транспортир conf.json:
"use strict";
exports.config = {
specs: '../E2ETests/**/*.js',
chromeOnly: true,
getPageTimeout: 30000,
allScriptsTimeout: 30000
}
Тест:
"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
Вы должны установить размер окна в файле конфигурации
onPrepare: function() {
browser.manage().window().setSize(1600, 1000);
}
Следующее работало нормально для меня:
browser.actions().mouseMove(element).click();
Редактировать: Если вышеописанное не работает, попробуйте также метод chaining execute() (я получил это как предложение по редактированию, я не проверял его, но кто-то мог проверить это и прокомментировать)
browser.actions().mouseMove(element).click().perform();
Это происходит, если окно хрома слишком мало, попробуйте добавить внутри beforeEach
browser.driver.manage().window().setSize(1280, 1024);
Или просто используйте класс Actions:
browser.actions().mouseMove(elem).click().perform();
Возможно, это не применимо в вашем случае, но я столкнулся с той же проблемой и на основе Milena ответ. Я искал другой элемент, скрывающий моя кнопка (в моем случае, выпадающее меню в правом верхнем углу экрана).
Это сообщение уведомления о подключении к браузеру, отправленное браузерами, запущенном Gulp. Сообщение исчезло через короткое время, но после моего вызова onClick().
Чтобы удалить уведомление, в моем gulpfile я добавил параметр notify: false при инициализации браузера:
browserSync.init(files, {
server: {
baseDir: "dist",
index: "index.html"
},
notify: false
});
Я исправляю эту проблему, используя время сна браузера.
browser.driver.sleep(3000)
перед нажатием кнопки
Имел ту же проблему, но не был связан с размером окна, но должен был ждать завершения 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
см. Документацию
У меня была такая же ошибка, и чисто регулировка размера экрана не исправила это для меня.
При дальнейшей проверке казалось, что другой элемент скрывает кнопку, поэтому тест Selenium не удался, потому что кнопка не была нажата (и не может быть). Возможно, поэтому, почему настройка размера экрана исправляет его для некоторых?
Какая фиксированная шахта удаляет другой элемент (и затем корректирует его положение).
Это работает лучше, чем указание размера окна, в случае, если вам нужно выполнить тест на нескольких дисплеях.
browser.manage().window().maximize();
Вы также можете попробовать отключить любые инструменты отладки, которые вы могли бы использовать. Я использовал Laravel и debugbar и должен был установить APP_DEBUG на false.
От Gal Malgarit ответьте,
Вы должны установить размер окна в файле конфигурации
onPrepare: function() {
browser.manage().window().setSize(1600, 800);
}
Если он все еще не работает, вы должны прокрутить до местоположения элемента
browser.executeScript('window.scrollTo(720, 881);');
element(by.id('add-stuff-button')).click();
Другой способ: вы можете попробовать следующее:
this.setScrollPage = function (element) {
function execScroll() {
return browser.executeScript('arguments[0].scrollIntoView()',
element.getWebElement())
}
browser.wait(execScroll, 5000);
element.click();
};
Обратите внимание, что это когда-то было вызвано верхней навигационной панелью или нижней навигационной панелью/предупреждающей панелью cookie, охватывающей элемент. С помощью angular 2 при нажатии на нее прокручивается, пока элемент не будет только на странице. Это означает, что при прокрутке вниз, чтобы щелкнуть что-либо, если есть нижняя навигация, это будет затруднять щелчок. Аналогично, при прокрутке вверх он может быть покрыт верхней навигацией.
Теперь, чтобы обойти прокрутку, я использую следующее:
browser.refresh();
browser.driver.sleep(3000);
Я убедился, что удалил нижний план, щелкнув, чтобы закрыть его до начала теста.
Вы можете определить желаемое разрешение экрана через файл конфигурации транспортира (например, protractor.conf.js
или config.js
) для согласованного поведения при тестировании.
exports.config = {
specs: [
// ...
],
capabilities: {
browserName: 'chrome',
chromeOptions: {
args: [
'--window-size=1600,900',
'--headless'
]
}
}
// ...
}
window-size
запустит Chrome с окном 1600 на 900.headless
запустит Chrome без головы, что позволит вам запускать тесты с указанным размером окна (1600 на 900), даже если разрешение экрана ниже этого.Возможно, вы захотите иметь две конфигурации: одну для разработчиков (без режима без головы), у которых всегда есть экран с высоким разрешением, и другую для серверов сборки (без монитора), где разрешение экрана иногда остается загадкой и может быть ниже, чем у вашего приложения/теста. предназначен для. Файл конфигурации транспортира - javascript и может быть расширен, чтобы избежать дублирования кода.