【问题标题】:Selenium: Browser display is different then HTML codeSelenium:浏览器显示与 HTML 代码不同
【发布时间】:2013-10-24 06:29:31
【问题描述】:

我想使用 Python 使用 Selenium 登录到这个 page。但是在浏览器中显示的页面与 HTML 中描述的页面不同。Firefox 或 Chrome webdriver 得到相同的结果。

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

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

【问题讨论】:

标签: python html google-chrome selenium


【解决方案1】:

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")

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

【讨论】:

  • 但这给了我完全相同的 html 结果。 js_code = "return document.getElementsByTagName('html')" your_elements = driver.execute_script(js_code) source_code = your_elements[0].get_attribute("outerHTML") print source_code
  • 您注意到代码中的框架了吗?框架需要特殊处理。查看我的编辑。
猜你喜欢
  • 2020-12-06
  • 1970-01-01
  • 1970-01-01
  • 2019-09-10
  • 1970-01-01
  • 1970-01-01
  • 2012-03-29
  • 2016-01-25
  • 1970-01-01
相关资源
最近更新 更多