2015-03-30 180 views
4

我目前通过Python中的PhantomJS + Selenium运行浏览器测试。处理重定向w/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,发布的解决方案包括添加一小段代码来适当地处理重定向。

如果您使用Selenium运行测试(在我的第一个代码段中),您如何添加此代码?它是否是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的开发尝试。

+0

你用什么版本?也许你需要更新到PhantomJS 2. – 2015-03-31 08:02:55

+0

我在1.9.8和2.0.1开发版中尝试过。 – okoboko 2015-04-01 04:20:27

回答

3

原来的页面由于错误而无法检索:SSL handshake failed

的解决方法是使用下面的行初始化驱动程序:

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

请将此标记为可接受的解决方案。 – LittlePanda 2015-04-01 05:19:43

1

我已经使用了以下设置:

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不适合您,请尝试从登录页面之前出现的页面进行导航。

+0

我复制了你的确切代码,但用Python。基本上,用户代理)并添加此'desired_capabilities [“javascriptEnabled”] = True' - 仍然没有运气。输出:''。有什么想法吗? – okoboko 2015-03-31 05:35:28

+0

当我试图直接导航到第2页时,我遇到了同一个网站的情况。有些网站不会允许您的代码直接导航到第n页,而无需浏览以前的页面。您必须确保您的代码开始从基本页面导航 - http://login.vrealizeair.vmware.com。这是关于相同的原产地政策。如果导航到登录页面会给您一个空的html,请尝试导航到登录页面之前发生的页面。 – LittlePanda 2015-03-31 07:10:11

+0

请出示您的PhantomJS版本。 – 2015-03-31 08:03:46

1

该解决方案真正为我工作,我得到下面的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")