Я пытаюсь запустить автоматические безголовые тесты селена, и я сталкиваюсь с проблемой, когда тесты зависают по какой-то необъяснимой причине. Полный фрагмент находится на pastebin, но соответствующая часть кода воспроизводится ниже:
# stress testing
i = 0
while True:
print i
d = webdriver.Remote(
service.service_url,
desired_capabilities=DesiredCapabilities.CHROME
)
print i, "started driver"
d.get("http://www.facebook.com")
print i, "got fb"
d.quit()
print i, "quit"
i += 1
Пример вывода
0
0 started driver
0 got fb
0 quit
...
11 <hang>
Это указывает на то, что webdriver.Remote
отказывается правильно инициировать драйвер. Это также происходит, когда экземпляр драйвера создается непосредственно с помощью webdriver.Chrome
(вместо запуска ChromeDriver как службы).
После отправки SIGINT зависшей программе я получаю трассировку стека (pastebin), указывающую на блокирующий сокет, считанный где-то в конструкторе .
Журнал ChromeDriver (dropcanvas), кажется, не указывает на что-то неправильное, и я весьма озадачен тем, что происходит здесь.
Подобные вопросы задавались ранее, наиболее актуальными из которых были Selenium Chromedriver Hangs?; однако я не могу воспроизвести принятое решение (запуская Xvfb заново для каждого экземпляра webdriver...
). Здесь эквивалентом будет вызов Xvfb.start
непосредственно перед d = webdriver.Remote...
и вызов Xvfb.stop
в конце цикла; Я пробовал это безуспешно.
Любая помощь будет принята с благодарностью.
Редактировать: как видно из трассировки стека, webdriver.Remote
зависал на какой-то функции чтения сокета; Я проследил запрос, чтобы быть
POST 'http://127.0.0.1:<chromedriver_port>/session'
с телом
'{"desiredCapabilities": {"platform": "ANY", "browserName": "chrome", "version": "", "javascriptEnabled": true}}'
Похоже, что ChromeDriver по какой-то причине не отвечает. Продолжим отладку.