Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Selenium C# Nunit3 Element not visible так как вне зоны видимости и браузер не скролит

csharp
selenium
Теги: #<Tag:0x00007f7b6456d470> #<Tag:0x00007f7b6456d218>

(Lelik) #1

Selenium C# Nunit3 Element not visible так как вне зоны виидмости и браузер не скролит

Заускаю тест на локальной машине.
Открывается браузер, максимизируется на весь экран и тест проходит успешно.
Этот же тест запускается на удаленной машине. И падает с ошибкой Element not visible . Сделала скрин во время падения - выяснилось что или браузер не раскрылся максимально, или запуск тестов происходит в каким-то дефолтными мини-разрешением. Кнопку которую нужно нажать за пределами, т.е. появляется скрол и нужно скролить. Открывала приложение на удаленной машине в браузере - все ок. Все кнопки видны.


(Сергей Кузьмин) #2

почему то кажется что service account профиль не дает того размера десктопа что ваш интерактивный юзер профиль

а что за тест такой что тольно на видимом экране элементы отрабатывает без ошибочно - это хорошие best тестинг практики или нет ?
мне всегда же кажется можно переместить таргет в видимую часть страницы или нет. Кажется я что то неправильно понял пожалуйста разъясните


(Alexandr D.) #3

А это совсем не факт.
Посмотрите и убедитесь, что локатор, по котором вы ищите кнопку - находит её желательно одну, и именно ту, что является видимой.

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

Попробуйте сделать MoveToElement из Actions.


(Lelik) #4
В начале происходит Set up:

 Driver = new ChromeDriver();
 ChromeOptions options = new ChromeOptions();
            options.AddArgument("--start-maximized");
            Driver = new ChromeDriver(options);

            ((IJavaScriptExecutor)Driver).ExecuteScript("window.resizeTo(1920, 1080);");
            //test manufacturing
            Driver.Navigate().GoToUrl("https://mypage.net/#/login");

и через какао-то время тест падает

Error Message:
   OpenQA.Selenium.ElementNotVisibleException : element not interactable
  (Session info: chrome=69.0.3497.100)
  (Driver info: chromedriver=2.42.591088 (7b2b2dca23cca0862f674758c9a3933e685c27d5),platform=Windows NT 10.0.10240 x86_64)

Локально это тест отрабатывает и Chrome открывается на полный экран.
Запустила тест на удаленной машине и скрин ошибки показал что окно браузера маленькое и кнопка не попадает в поле видимости https://www.screencast.com/t/DqVEPWqhEd.
Т.е фактически кнопка Save она там одна. В приложении эта форма вызывается и из других мест, и она там поменьеш и соответственно те тесты отрабатывают, так как кнопка видимая. И если бы проблема была только в одной кнопке. Таким образом отрезается еще часть полей\дропдайнов\кнопок в других тестах.
Главный вопрос, почему не открывается максимальное окно браузера. Если просто запускаешь Chrome - браузер открыватеся сразу в максимальном размере, а автоматически - нет.


(Alexandr D.) #5

Смотря как вы запускаете браузер на удаленной машине.
Если из-под службы, которая работает от системы - тогда оно никогда не откроется в большом размере. (типичный случай когда нода на CI Jenkins работает как Windows Service).

По скриншоту непонятно, где должна быть кнопка-то?

Ну и по-моему вы слишком заморочено меняете размеры браузера, ведь можно куда проще:

            DriverManager.Driver.Manage().Window.Size = new Size(1920, 1080);
            DriverManager.Driver.Manage().Window.Maximize();

Вы пробовали сначала переместиться к элементу, прежде чем кликнуть? Или ожидать пока он станет видимым?

var actions = new Actions(driver);
actions.MoveToElement(element);
actions.Perform();

(Lelik) #6

Кнопка в правом нижнем углу. Ее на скрине нет. До нее еще скролить приблизительно 3-4 сантиметра.

Я тоже очень подозреваю что это Windows Service. Так как во время запуска я вижу Chrome только в процессах, а не реально запущенный.

Двигаться к элементу я оставила как крайний случай. Очень много переделывать. Может еть другие варианты как раскрыть?


(Alexandr D.) #7

В смысле много переделывать?

Вам пару строк кода надо написать перед тем, как вызывать метод клика на элементе.

Просто для проверки.


(Lelik) #8

Но у меня же не один тест и не одна кнопка. Приблизительно 100 кнопок\полей\чекбоксов :frowning:


(Alexandr D.) #9

Вы проверьте в одном месте. Поможет это или нет. Зачем сразу везде менять? :slight_smile:


(Сергей Кузьмин) #10

запускать на Linux vm или контейнере / Xvfb или vnc / Chrome или FF не пробовали ? все проблемы сразу решите


(Сергей Кузьмин) #11

по моему еще javascrtipt ом можно двигать - несколько способов есть
например основанный на DOM методе

разнообозные его обертки


(Ihor Kokhan) #12

Попробуйте (IJavaScriptExecutor)Driver.ExecuteScript(“window.scrollTo(0,document.body.scrollHeight);”);
У меня работает.
Если не получится, пробуйте через new Actions(Driver).MoveToElement(element).Click().Perform();


(Lelik) #13

@Noksa @Ihor_Kokhan Попробовала принудительно задавать размер окна, максимизировать, настраивать установки Crome на машине, на которой запускаются тесты. Ничего не помогло.
Сработало только Actions(Driver).MoveToElement(element).Click().Perform();
Но в этом случае мне нужно сделать свой метод Click2, который будет включать Actions(Driver).MoveToElement(element).Click().Perform(); + Click(). И вызывать именно этот клик во всех проблемных местах.


(Lelik) #14

@sergueik на Linux я пока не готова переходить. Недостаток знаний потребует больше усилий для решения проблемы.


(Ihor Kokhan) #15

Уже включает в себе клик. Реплейс можете сделать по всему солюшену через ctrl+F в студии
2018-10-10_1147


(Lelik) #16

Actions(Driver).MoveToElement(element).Click().Perform();

@Ihor_Kokhan а конечно, можно сделать замену по всему проекту. Но как? :slight_smile:
Например :
list.btnDelete.Click();
т.е. мне нужно Actions(Driver).MoveToElement(list.btnDelete).Click().Perform();
Или я не правильно поняла?


(Сергей Кузьмин) #17

что нибудь типа

find . -type f -a -name '*.cs' -exec sed -i 's/\(.*\).Click()/Actions(Driver).MoveToElement(\1).Click().Perform();/p' {} \;

может подойдет ? - я только что проверил что работает как надо :slight_smile:
это выполнять из git bash если у вас windows вокруг


(Ihor Kokhan) #18

именно.
Заходите в студию. Нажимаете ctrl+F. Потом стрелочку в левом верхнем углу диалога чтоб свичнутся на реплейс. И меняете current document на Entire Solution. Скриншот диалога лепил выше.


(Сергей Кузьмин) #19

@Ihor_Kokhan а captures студия визуаль умеет тоже ?


(Ihor Kokhan) #20

@sergueik Что вы имеете ввиду под словом captures? И как это относится к вопросу автора? :thinking: