Webdriver phantomjs在点击时不再跟踪链接[英] Webdriver phantomjs no longer following link on click

问题描述

我使用一个简单的 webdriver phantomjs 脚本来更新 preloved.co.uk 上的一些广告.该脚本直到最近都运行良好,但在单击登录链接后开始出现"单击提交但加载失败"错误.按照 this 我更新了我的版本按照指南这里,将 phantomjs 升级到最新的稳定版 1.9.7>.但是,现在登录点击似乎也没有注册,页面也没有重新加载.

第一步就是进入登录表单页面.

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/'.

推荐答案

登录页面通过 https 保护.最近 POODLE 漏洞迫使网站从 SSLv3 转移到 https,但由于 PhantomJS 默认使用 SSLv3 登录页面未加载.另请参阅此答案.

这可以通过将 --ssl-protocol=tlsv1 或 --ssl-protocol=any 传递给 PhantomJS 或将 PhantomJS 升级到至少 1.9.8 版本来解决.似乎 service_args 参数可以用于 Selenium 的 python 绑定中.

它看起来像 当前官方实现 service_args 不能从 WebDriver 传递到 PhantomJS 中的 Service.您可以对其进行子类化.

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 包含设置这些选项的必要参数.

本文地址:https://www.itbaoku.cn/post/1740018.html