Python 处理带幻影的重定向&x2B;硒

Python 处理带幻影的重定向&x2B;硒,python,selenium-webdriver,phantomjs,ghostdriver,Python,Selenium Webdriver,Phantomjs,Ghostdriver,我目前在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) Chr

我目前在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')
这很好,除非我试图获取的页面上有重定向

例如:

https://login.vrealizeair.vmware.com/
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);
    }
});
在这种情况下,
get
无法正常工作。页面源为空:

这是一个解决方案,涉及添加代码片段以适当处理重定向

如果您使用Selenium运行测试(在我的第一个代码片段中),如何/在何处添加此代码?它是
所需能力的一部分吗

例如:

https://login.vrealizeair.vmware.com/
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进行了尝试。

我使用了以下设置:

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
输出(工作正常):

https://login.vrealizeair.vmware.com/sso/UI/Login
登录| vRealize™ 空气™

导入说明:从主页开始导航。html代码为空,因为网站可能抛出403错误。如果登录URL不适用于您,请尝试从登录页面之前显示的页面导航。

结果表明,由于出现错误,
SSL握手失败。

解决方案是使用以下行初始化驱动程序:

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

这个解决方案对我来说真的很有效,我在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")

我复制了你的代码,但是是用Python编写的。基本上,用户代理)并添加此
所需的功能[“javascriptEnabled”]=True
——仍然没有成功。输出:
。有什么想法吗?当我试图直接导航到第2页时,我曾经在一个网站上遇到过同样的情况。有些网站不允许您的代码直接导航到第n页,而不浏览以前的页面。您必须确保您的代码从基本页开始导航-。这是关于同一原产地的政策。如果导航到登录页面会给您一个空html,请尝试导航到登录页面之前出现的页面。我使用的是1.9.8。直接访问此页面时应能正常工作-无需基本页面。我使用的是PhantomJS v2。升级到v2,你也应该可以使用。我使用phantonjs2.0.1-development尝试了你发布的代码(用于Python),但仍然收到
作为页面源代码。以下是ghostdriver.log的内容:您使用的是什么版本?也许你需要更新到PhantomJS2。我在1.9.8和2.0.1-development中试过。