2016-02-24 3 views
0

У меня есть сценарий, который должен взаимодействовать с веб-страницей через селен. Мне нужно использовать какой-то виртуальный дисплей, чтобы браузер не показывался.ElementNotVisibleException только в виртуальном дисплее

Сценарий в целом отлично работает, пока я не представим Xvfb в микс. Когда я это делаю, я получаю ElementNotVisibleException в первый раз, когда я фактически пытаюсь взаимодействовать со страницей.

Я пробовал использовать xvfbwrapper и pyvirtualdisplay с тем же эффектом.

А вот код, который не работает:

from xvfbwrapper import Xvfb 
vdisplay = Xvfb() 
vdisplay.start() 
oBrowser = Browser() 
oBrowser.visit(sUrl) 
oBrowser.find_by_id('some_field')[0].fill(sValue) #<--ERROR 
vdisplay.stop() 

А вот код, который делает работу (но отображает браузер):

oBrowser = Browser() 
oBrowser.visit(sUrl) 
oBrowser.find_by_id('some_field')[0].fill(sValue) #<--works every time 

Так как я могу запустить свой код на виртуальном дисплее?

Я попытался сделать time.sleep, прежде чем пытаться заполнить поле, но проблема, похоже, не имеет ничего общего с медленной загрузкой страницы. Есть идеи?

+0

er ... ваши теги неправильные: похоже, вы используете splinter (https://splinter.readthedocs.org/en/latest/), а не привязки selenium python (http: //selenium-python.readthedocs. орг/посаживания started.html). –

+0

@KirilS. Отметил. Сплинтер делает это волшебство через селен, поэтому корень вещей - проблема селена – Sheena

ответ

0

Это обходной путь более прямого решения:

я заменил эту строку:

oBrowser.find_by_id('some_field')[0].fill(sValue) 

С этим:

oBrowser.execute_script("document.getElementById('some_field').value = {}".format(sValue)) 

И это работает надежно. Я все еще не уверен, почему это было не просто в первую очередь.

Смежные вопросы