В целом свидетельствующей о том, что элемент не был найден и тест упал по таймауту. Это крайне странно учитывая, что локально, на моей машине тесты проходят идеально. Кейс такой:
Найти элемент на странице - кликунуть по нему.
Подождать пока появится другой элемент.
Открыть новую вкладку (с другим url) и ввести там логин/пароль (авторизоваться). <- тут как раз и ошибка
Такое ощущение, что Xvfb не может нормально работать со второй вкладкой браузера. Сразу ещё отмечу, что пробовал ставить разные задержки - time.sleep(5), wait.until(...), implicitly_wait(...) не помогло.
Это что за магия ?
window_handles возвращает set, неупорядоченый список. Потому нельзя по индексу -1 быть 100% уверенным в том, что вы откроете последнее окно.
driver.execute_script("window.open('https://myURL.com','_blank');") #открыть новую вкладку с заданным url
driver.switch_to.window(driver.window_handles[-1]) #переключиться на новую вкладку
Проще говоря, без этого все действия теста буду происходить на вкладке 1, а не 2.
Кстати, сейчас сделал скрин. Выдались очень интересные результаты:
Вкладок нет. То есть вообще нет даже адресной строки браузера. Специфика работы Xvfb?
Ok, вполне возможно, что я просто не переключаюсь на нужную вкладку, после команды driver.execute_script . Тогда каким образом мне это сделать? Кейс простой: открыть вкладку №2, перейти к ней, нажать там на кнопку.
Извините, но пример не рабочий.
Вот скрипт созданный по примеру:
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? Вижу это по скринам.
На ФФ не проверял. Давно уже на нём на работаю, и мне кажется, что на моей конфигурации системы (centOS+jenkins+selenium wd+python) поставить gekodriver будет тем ещё приключением с дополнительным пулом ошибок.
Конечно, если для корректной работы необходимо сугубо ФФ ставить, а данный косяк связан непосредственно в chromedriver, то это уже другой вопрос.
Кстати, похожие тесты я писал и крутились они на винда+jenkins практически безотказно.