2013-10-16 49 views
1

我想使用Python在Selenium上登录此page。但浏览器中显示的页面与HTML中描述的页面不同,Firefox或Chrome Web驱动程序获得相同的结果。Selenium:浏览器显示与HTML代码不同

chromedriver = "./chromedriver" 
os.environ["webdriver.chrome.driver"] = chromedriver 
driver = webdriver.Chrome(chromedriver) 

# OR 
#driver = webdriver.Firefox() 


driver.get('http://www.anb.org/login.htmlurl=%2Farticles%2Fhome.html&ip=94.112.189.79&nocookie=0') 
# get screenshot of page 
driver.get_screenshot_as_file('./01.png') 

#get source code of page 
print driver.page_source 

我不允许发布图像,但图像与网页浏览器中显示的页面完全相同。从驱动

HTML代码:

<html><head> 
<title>American National Biography Online</title> 
<script> 
document.write ("<FRAMESET ROWS=\"103,*\" FRAMEBORDER=0 BORDER=0 FRAMESPACING=0>\n"); 
document.write (" <FRAME SRC=\"top-home.html\" MARGINWIDTH=0 MARGINHEIGHT=0 SCROLLING=NO>\n"); 
if (location.search) { 
    var url = unescape (location.search); 
    url = (new String(url)).substring(1); 
    if (url.indexOf ("&") == -1) { 
    document.write (" <FRAME SRC=\"" + url + "\" MARGINWIDTH=0 MARGINHEIGHT=0>\n"); 
    } else { 
    document.write (" <FRAME SRC=\"main-home.html" + location.search + "\" MARGINWIDTH=0 MARGINHEIGHT=0>\n"); 
    } 
} 
else 
    document.write (" <FRAME SRC=\"main-home.html\" NAME=atop MARGINWIDTH=0 MARGINHEIGHT=0>\n"); 
document.write ("</FRAMESET>\n"); 
</script></head> 
<frameset rows="103,*" frameborder="0" border="0" framespacing="0"> 
    <frame src="top-home.html" marginwidth="0" marginheight="0" scrolling="NO"> 
    <frame src="main-home.html?url=%2Farticles%2Fbrowse.html&amp;ip=94.112.189.79&amp;nocookie=0" marginwidth="0" marginheight="0"> 
</frameset> 

<noframes> 
</noframes> 
</html> 

正如你所看到的,HTML和图片不匹配。

也许问题是与帧?

我的配置:

osx 10.8.5 
python 2.7.5 
chrome browser 28.0.1500.71 
firefox browser 24.0 

我安装了最新的铬/火狐webdrivers,但我真的不知道如何找到版本。

+1

我没有看到这个HTML是错误的,它只是由服务器提供的HTML,它被JavaScript调用之前。 –

+1

可能的重复[如何可以通过JavaScript使用Selenium/Python编写html内容](http://stackoverflow.com/questions/16073626/how-can-i-get-html-content-written-by-javascript- with-selenium-python) –

+0

这正是问题所在,也是HTML不同的原因。这不是一个未知的代码,只是原来的代码。 –

回答

3

属性page_source几乎没用:它返回服务器发送给浏览器的第一个HTML版本;它的不是副本目前 DOM。

得到一份最好的办法是使用JavaScript和innerHTML

js_code = "return document.getElementsByTagName('html').innerHTML" 
your_elements = sel.execute_script(js_code) 

还要注意的是innerHTML不跨越frame元素。既然你已经在你的代码框架,你需要单独检查这些:

frames = driver.find_element_by_tag_name("frame") 
js_code = "return arguments[0].innerHTML" 
your_elements = sel.execute_script(js_code, frames[0]) 

你也可以切换到一个框架:

driver.switch_to_frame("frameName") 

之后,所有代码将这个帧的上下文中执行。不要忘记切换回来。

+0

但这给了我完全一样的html结果。 js_code = “返回document.getElementsByTagName( 'HTML')” your_elements = driver.execute_script(js_code)\t \t source_code = your_elements [0] .get_attribute( “outerHTML”) 打印source_code – Keresan

+0

你没有注意到的帧你的代码?帧需要特殊处理。查看我的编辑。 –

+0

切换帧是解决方案。非常感谢 – Keresan