#python #firefox #selenium-webdriver #web-scraping #phantomjs
#питон #firefox #selenium-веб-драйвер #соскабливание полотна #phantomjs
Вопрос:
Итак, у меня есть веб-сайт, на котором есть комбо, из которого мне нужно выбрать элемент, теперь проблема в том, что он немного нетрадиционный и не имеет опций в качестве элементов, но вместо этого у него есть divs.
Итак, мне нужно, чтобы моя программа щелкнула поле со списком, затем подождала (лучший способ сделать это, который я нашел, — через implicitly_wait(3) # 3 секунды), а затем щелкните нужный мне элемент box. Firefox отлично справляется с этим, но PhantomJS, похоже, бросает:
Selenium.common.exceptions.ElementNotVisibleException:
Message: 'Error Message => 'Element is not currently visible and may not be manipulated'
Я не уверен, в чем причина этого, но я подозреваю, что PhantomJS по какой-то причине не может корректно ждать через implicitly_wait и пытается выбрать невидимый элемент.
Есть какие-нибудь идеи, как подойти к этому без принудительного сна потока?
Комментарии:
1. Работает ли это с
Thread.sleep
? Если нет, то есть ли ошибки на странице? Если затронута привязка , вам может понадобиться прокладка , с помощью которой вы будете выполнятьсяexecute_script
.2. Да, thread.sleep, похоже, работает, но, похоже, для этого требуется не менее 3 секунд, поэтому, если есть 3 поля со списком, это 9 секунд на запуск, что довольно нелепо, даже запуск его напрямую через firefox с implicitly_wait продолжительностью 3 секунды занимает значительно меньше.
3. У меня также возникли проблемы с implicitly_wait и PhantomJS. Интересно, не реализовано ли это в PhantomJS?
Ответ №1:
Да, ваша проблема звучит именно так, как я только что исправил в тесте пользовательского интерфейса, который начал меня раздражать. Довольно сложный, который прошел во всех браузерах, кроме моего любимого PhantomJS (который самый быстрый).
Это было довольно неприятно, когда в отладчике я мог ясно видеть, что даже родительский элемент был установлен на видимый. Не был виден только компонент prime faces, который мне нужно было щелкнуть по какой-либо причине (не CSS или активные стили).
Посмотрев на скриншот Phantom JS, я понял, что окно было довольно крошечным, и действительно, элемент пользовательского интерфейса не был визуально виден.
Теперь вы понимаете, к чему я клоню?
Phantom JS — это безголовый браузер, он не отображает вам окно, но он использует окно, и у окна есть размер. Исключение довольно неожиданное, потому что движок за ним такой же, как и в Chrome и Safari… все должно просто работать.
Что ж, в конце концов они так и сделали. Попробуйте настроить свой завод драйверов следующим образом:
WebDriver driver = new PhantomJSDriver();
driver.manage().window().setSize(new Dimension(800, 600));
return driver;
Желаю удачи.