Selenium PhantomJS выдает EelementNotVisible, в то время как Firefox полностью исправен при выборе поля со списком

#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;
 

Желаю удачи.