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

Запуск тестов Selenium с Xvfb выдаёт ошибку

centos
xvfb
python
selenium
webdriver
Теги: #<Tag:0x00007f7b69771960> #<Tag:0x00007f7b69771690> #<Tag:0x00007f7b69771488> #<Tag:0x00007f7b69770b78> #<Tag:0x00007f7b69770790>

(Максим Неверный) #1

Всем привет!
Вопрос в следующем про Xvfb + Selenium WD + Python.

  1. Есть сервер на котором крутятся тесты (CentOS + Jenkins)
  2. Запуск тестов происходит без графики, используем Xvfb.

Ситуация такая, что тесты нормально идут вплоть до команды:

driver.execute_script("window.open('https://myURL.com','_blank');")
driver.switch_to.window(driver.window_handles[-1])
driver.find_element_by_id('username').send_keys('username')

После чего падают с ошибкой:

driver.find_element_by_id('username').send_keys('name')
<...>
selenium.common.exceptions.TimeoutException: Message: timeout

В целом свидетельствующей о том, что элемент не был найден и тест упал по таймауту. Это крайне странно учитывая, что локально, на моей машине тесты проходят идеально. Кейс такой:

Найти элемент на странице - кликунуть по нему.
Подождать пока появится другой элемент.
Открыть новую вкладку (с другим url) и ввести там логин/пароль (авторизоваться). <- тут как раз и ошибка
Такое ощущение, что Xvfb не может нормально работать со второй вкладкой браузера. Сразу ещё отмечу, что пробовал ставить разные задержки - time.sleep(5), wait.until(...), implicitly_wait(...) не помогло.


(Yaroslav Pernerovskyy) #2

Это что за магия ?
window_handles возвращает set, неупорядоченый список. Потому нельзя по индексу -1 быть 100% уверенным в том, что вы откроете последнее окно.


(Максим Неверный) #3
driver.execute_script("window.open('https://myURL.com','_blank');") #открыть новую вкладку с заданным url
driver.switch_to.window(driver.window_handles[-1]) #переключиться на новую вкладку

Проще говоря, без этого все действия теста буду происходить на вкладке 1, а не 2.
Кстати, сейчас сделал скрин. Выдались очень интересные результаты:

  1. Вкладок нет. То есть вообще нет даже адресной строки браузера. Специфика работы Xvfb?
  2. Выдал ошибку:
    selenium.common.exceptions.WebDriverException: Message: unknown error: unhandled inspector error: {"code":-32000,"message":"Cannot navigate to invalid URL"}

(Максим Неверный) #4

Ok, вполне возможно, что я просто не переключаюсь на нужную вкладку, после команды driver.execute_script . Тогда каким образом мне это сделать? Кейс простой: открыть вкладку №2, перейти к ней, нажать там на кнопку.


(Yaroslav Pernerovskyy) #5

Тут нужна другая магия.

  1. запоминаем хендл текущего окна
  2. открываем новое
  3. берем хендлы всех открытых окон
  4. переключаемся в то окно, хендл которого отличается от сохраненного

вот тут примеры есть:


(Максим Неверный) #6

Извините, но пример не рабочий.
Вот скрипт созданный по примеру:

        driver = webdriver.Chrome()
        driver.get('https://yandex.ru/')
        wait = WebDriverWait(driver, 10)
        time.sleep(1)
        driver.find_element_by_name('text').send_keys('hello world!'+Keys.RETURN)
        print("BINGO!")
        driver.set_window_size(1920, 1080)
        time.sleep(1)
        driver.execute_script("window.open('https://www.rambler.ru/','_blank');")
        time.sleep(1)
        current_window = driver.current_window_handle
        old_windows = driver.window_handles
        time.sleep(2)
        new_window = [i for i in driver.window_handles if i not in old_windows]
        driver.switch_to.window(new_window[0])
        driver.find_element_by_name('query').send_keys('hello world!'+Keys.RETURN)
        time.sleep(2)
        driver.close()
        driver.switch_to.window(current_window)

Он выдал ошибку:

line 29, in test001_Login
    driver.switch_to.window(new_window[0])
IndexError: list index out of range

Но суть даже не в этом. Возвращаясь к моему вопросу, просто стало интересно понять, почему driver.execute_script("window.open('URL','_blank');") не открывает новую вкладку с url? Вижу это по скринам.


(Yaroslav Pernerovskyy) #7

о, так у вас другая проблема. просто вкладка не открылась. а какой браузер ?


(Yaroslav Pernerovskyy) #8

window.open('https://www.rambler.ru/');

тоже не работает ?


(Максим Неверный) #9

Chrome. Chromedriver, соответственно.
driver.find_element_by_tag_name("body").send_keys(Keys.CONTROL + 't') уже пробовал, результата нет.


(Максим Неверный) #10

Да, тоже не работает, ошибка та же


(Yaroslav Pernerovskyy) #11

а в ФФ такая же петруха?


(Максим Неверный) #12

На ФФ не проверял. Давно уже на нём на работаю, и мне кажется, что на моей конфигурации системы (centOS+jenkins+selenium wd+python) поставить gekodriver будет тем ещё приключением с дополнительным пулом ошибок.
Конечно, если для корректной работы необходимо сугубо ФФ ставить, а данный косяк связан непосредственно в chromedriver, то это уже другой вопрос.
Кстати, похожие тесты я писал и крутились они на винда+jenkins практически безотказно.


#13

А пробовал сделать скриншот сразу после открытия яндекса? Чтоб убедиться, там вообще драйвер поднят, страница открыта?


(Максим Неверный) #14

Да, пробовал такое. Открываем новую вкладку и делаем скриншот. Результат странный:

driver.save_screenshot('test010_LetMeIn.png')
selenium.common.exceptions.TimeoutException: Message: timeout

Такую выдаёт ошибку. Просто не смог сделать скрин. До этого всё Ок, скрины есть, тест идёт.


(Yaroslav Pernerovskyy) #15

попробуйте Selenoid https://github.com/aerokube/selenoid