【问题标题】:Handling Redirection w/ PhantomJS + Selenium使用 PhantomJS + Selenium 处理重定向
【发布时间】:2015-03-30 23:47:39
【问题描述】:

我目前在 Python 中通过 PhantomJS + Selenium 运行浏览器测试。

desired_capabilities = dict(DesiredCapabilities.PHANTOMJS)
desired_capabilities["phantomjs.page.settings.userAgent"] = ("Mozilla/5.0 (Macintosh; Intel Mac OS X 10_10_2) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/40.0.2214.115 Safari/537.36")
driver = webdriver.PhantomJS(executable_path="./phantomjs", desired_capabilities=desired_capabilities)
driver.get('http://google.com')

这很好用,除非我尝试get 的页面上有重定向。

例子:

https://login.vrealizeair.vmware.com/

在这种情况下,get 无法正常工作。页面源为空:<html><head></head></body></html>

这是一个 known issue,其中发布了涉及添加 sn-p 代码以适当处理重定向的解决方案。

如果您使用 Selenium 运行测试(在我的第一个代码 sn-p 中),您如何/在哪里添加此代码?它是desired_capabilties 的一部分吗?

例子:

page.onNavigationRequested = function(url, type, willNavigate, main) {
    if (main && url!=myurl) {
        myurl = url;
        console.log("redirect caught")
        page.close()
        renderPage(url);
    }
};

page.open(url, function(status) {
    if (status==="success") {
    console.log(myurl);
        console.log("success")
            page.render('yourscreenshot.png');
            phantom.exit(0);
    } else {
        console.log("failed")
            phantom.exit(1);
    }
});

我用 PhantomJS 1.9.8 和 2.0.1-development 进行了尝试。

【问题讨论】:

  • 你用的是什么版本?也许你需要更新到 PhantomJS 2。
  • 我在 1.9.8 和 2.0.1-development 中尝试过。

标签: python selenium-webdriver phantomjs ghostdriver


【解决方案1】:

原来页面由于错误而无法抓取:SSL handshake failed

解决办法是使用下面这行来初始化驱动:

driver = webdriver.PhantomJS(executable_path="./phantomjs", service_args=['--ignore-ssl-errors=true'])

【讨论】:

    【解决方案2】:

    我使用了以下设置:

    DesiredCapabilities capabilities;
    capabilities = new DesiredCapabilities();       
    capabilities.setJavascriptEnabled(true);
    capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "drivers/phantomjs.exe");
    capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_PAGE_SETTINGS_PREFIX,"Y");
    capabilities.setCapability("phantomjs.page.settings.userAgent", "Mozilla/5.0 (Windows NT 6.1; Win64; x64; rv:16.0) Gecko/20121026 Firefox/16.0");
    
    //intialize driver and set capabilties
    
    driver = new PhantomJSDriver(capabilities);
    

    然后,我执行了以下两行,它们对我来说效果很好

    driver.get("https://login.vrealizeair.vmware.com/");
    System.out.println(driver.getCurrentUrl());
    System.out.println(driver.getPageSource());
    

    这是输出:

    https://login.vrealizeair.vmware.com/sso/UI/Login
    <!-- [RESPONSE_PAGE_TYPE=3DLOGIN] --><!DOCTYPE html><html><head>
        <meta charset="utf-8">
        <meta http-equiv="X-UA-Compatible" content="IE=edge">
        <title>Login | vRealize™ Air™</title>
        <link rel="stylesheet" href="/sso/css/styles.css?v=3" type="text/css">
        <link rel="shortcut icon" href="/sso/images/vmwareFavicon.ico" type="image/x-icon">
    
        <script async="" src="//rum-static.pingdom.net/prum.min.js"></script><script>...........................................
    .....................................................
    ...................................................//Entire page source was displayed
    

    我在 python 中尝试了以下代码,它似乎工作正常:

    from selenium import webdriver
    
    driver = webdriver.PhantomJS("./phantomjs") 
    
    driver.get("https://login.vrealizeair.vmware.com/")
    print 'done'
    print driver.current_url
    print driver.page_source
    

    输出(工作正常):

    https://login.vrealizeair.vmware.com/sso/UI/Login
    <!-- [RESPONSE_PAGE_TYPE=3DLOGIN] --><!DOCTYPE html><html><head>
            <meta charset="utf-8">
            <meta http-equiv="X-UA-Compatible" content="IE=edge">
            <title>Login | vRealize™ Air™</title>
            <link rel="stylesheet" href="/sso/css/styles.css?v=3" type="text/css">
    

    提示说明:从基本页面开始导航。 html 代码是空的,因为网站可能会抛出 403 错误。如果登录 URL 不适合您,请尝试从登录页面之前出现的页面导航。

    【讨论】:

    • 我复制了您的确切代码,但使用的是 Python。基本上,用户代理)并添加此desired_capabilities["javascriptEnabled"] = True - 仍然没有运气。输出:&lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt;。有什么想法吗?
    • 当我试图直接导航到第 2 页时,我在一个网站上遇到了同样的情况。有些网站不允许您的代码直接导航到第 n 页,而无需浏览前一页。您必须确保您的代码从基本页面开始导航 - login.vrealizeair.vmware.com。这与同源政策有关。如果导航到登录页面给您一个空 html,请尝试导航到登录页面之前的页面。
    • 我在 1.9.8。此页面在直接访问时应该可以工作 - 不需要基本页面。
    • 我正在使用 PhantomJS v2。升级到 v2,它应该也适合你。
    • 我使用 PhantonJS 2.0.1-development 尝试了您发布的确切代码(用于 Python),但仍然收到 &lt;html&gt;&lt;head&gt;&lt;/head&gt;&lt;body&gt;&lt;/body&gt;&lt;/html&gt; 作为页面源。下面是 ghostdriver.log 的内容:gist.github.com/anonymous/5e5ea41a7704414514e5
    【解决方案3】:

    这个解决方案真的对我有用,我在 phantomjsdriver.log 中遇到错误,在尝试登录时,phantomjs 已注销。

    [DEBUG - 2017-08-19T20:37:59.288Z] Session [47739640-851e-11e7-9326-9bef0ad085f5] - page.onResourceError - {"errorCode":299,"errorString":"Error transferring https://int-test-cc.gcsip.nl:4443/rest/user/keepAlive?cacheBuster=1503175078533 - server replied: Unsupported Media Type","id":9,"status":415,"statusText":"Unsupported Media Type","url":"IPAdd:port/rest/user/keepAlive?cacheBuster=1503175078533"}
    

    在向 phantomjs 添加以下功能后,它起作用了 -

    caps.setJavascriptEnabled(true)
    caps.setCapability(PhantomJSDriverService.PHANTOMJS_EXECUTABLE_PATH_PROPERTY, "phantomjs")
    caps.setCapability(PhantomJSDriverService.PHANTOMJS_PAGE_SETTINGS_PREFIX,"Y");
    caps.setCapability("phantomjs.page.settings.userAgent","Mozilla/5.0 (X11; Linux x86_64; rv:46.0) Gecko/20100101 Firefox/46.0")//"Mozilla/5.0 (Unknown; Linux x86_64) AppleWebKit/602.1 (KHTML, like Gecko) PhantomJS/2.5.0-development Version/9.0 Safari/602.1")
    caps.setCapability(PhantomJSDriverService.PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "Content-Type","application/json;charset=utf-8")
    caps.setCapability(PhantomJSDriverService.PHANTOMJS_PAGE_CUSTOMHEADERS_PREFIX + "Connection","Keep-Alive")
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2016-12-24
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-03-10
      • 2018-01-16
      相关资源
      最近更新 更多