2014-10-25 3 views
1

Я использую простой скрипт phantomjs webdriver для обновления некоторых объявлений на preloved.co.uk. Этот скрипт работал отлично до недавнего времени, но затем начал сбой с ошибкой «Нажмите представленную, но загруженную с ошибкой» после того, как была нажата ссылка для входа в систему. В соответствии с this я обновил мою версию phantomjs до последней стабильной версии, 1.9.7 после руководства here. Однако теперь клик входа в систему не регистрируется, и страница не перезагружается.Webdriver phantomjs больше не ссылается на ссылку

Первый шаг - просто перейти на страницу входа в систему.

from selenium import webdriver 
br = webdriver.PhantomJS(service_log_path='/path/to/logfile.log') 
url = "http://www.preloved.co.uk" 
br.get(url) 

# Go to login page 
login_button = br.find_element_by_xpath('//div[@id="header-status-login"]/a') 
login_button.click() 

Обычно (и если вы замените строку браузера с br = webdriver.Firefox(), например), это приводит к перегрузке на страницу входа, и сценарий исходит оттуда, но теперь появляется щелчок не загружает новую страницу в все и br.current_url по-прежнему 'http://www.preloved.co.uk/'

Почему эта загрузка не работает?

Даже если я извлечь HREF и сделать явный GET это, кажется, не следуют и перезагружать:

newurl=login_button.get_attribute('href') 
br.get(newurl) 

br.current_url по-прежнему «http://www.preloved.co.uk/».

ответ

3

Страница регистрации защищена через https. В последнее время уязвимость POODLE заставила сайты отойти от SSLv3 для https, но поскольку PhantomJS использует SSLv3 per default, страница входа в систему не загружается. См. Также this answer.

Это можно исправить, передав --ssl-protocol=tlsv1 или --ssl-protocol=any на PhantomJS или обновив PhantomJS по меньшей мере до версии 1.9.8. Кажется, что аргумент service_args можно использовать для связывания python для Selenium.

Похоже, в current official implementationservice_args не может передаваться от WebDriver к Service в PhantomJS. Вы можете подклассифицировать его.

from selenium import webdriver 
from selenium.webdriver.phantomjs.service import Service 
from selenium.webdriver.common.desired_capabilities import DesiredCapabilities 
from selenium.webdriver.remote.webdriver import WebDriver as RemoteWebDriver 

class PhantomJSService(webdriver.PhantomJS): 
    def __init__(self, executable_path="phantomjs", port=0, 
       desired_capabilities=DesiredCapabilities.PHANTOMJS, 
       service_args=None, service_log_path=None): 

     self.service = Service(executable_path, 
           port=port, service_args=service_args, 
           log_path=service_log_path) 
     self.service.start() 

     try: 
      RemoteWebDriver.__init__(self, 
       command_executor=self.service.service_url, 
       desired_capabilities=desired_capabilities) 
     except: 
      self.quit() 
      raise 

Кажется, что это webdriver fork содержит необходимые аргументы, чтобы установить эти параметры.

+0

Вижу, спасибо! Не могли бы вы сказать еще немного о том, как реализовать этот патч обезьяны в моем маленьком скрипте выше ... – fpghost

+0

Я добавил подкласс, а не патч обезьяны. Теперь я вижу, что вы используете 'service_log_path'. Правильно ли он регистрируется? –

+0

Во-первых, 'br = PhantomJSService (service_args = ['- ssl-protocol = any',])' отлично работает с подклассом, поэтому спасибо за это. Что касается протоколирования, я не совсем уверен, что делать с 'service_log_path' сейчас, передавая его как аргумент' 'PhantomJSService' '' с неожиданным ключевым словом, и передача его в список service_args также не выполняется с' невозможно подключиться к GhostDriver' – fpghost

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