Selenium驱动程序的页面源不同于浏览器

时间:2017-07-21 20:31:41

标签: python selenium

我很遗憾无法发布代码来重现此问题,因为它涉及登录不是公共网站的网站。但我的问题比代码问题更普遍。实际上,driver.page_source与它正在驱动的浏览器中显示的内容不匹配。这不是一个没有完全加载的元素的问题,因为我在python终端中逐行执行代码时测试它。右键单击并转到“查看页面源”后,我在浏览器中查看页面源,但是如果我打印driver.page_source或尝试find_element_by_[...],它会显示略有不同的代码,但缺少整个元素。这是有问题的html:

<nav role="navigation" class="utility-nav__wrapper--right">
<input id="hdn_partyId" value="1965629" type="hidden">
<input id="hdn_firstName" value="CHARLES" type="hidden">
<input id="hdn_sessionId" value="uHxQhlARvzA7N16uh+KJAdNFIcY6D8f9ornqoPQ" type="hidden">
<input id="hdn_cmsAlertRequest" type="hidden" value="Biennial Plus">
<ul class="h-list h-list--middle">
    [...]
</ul>

我需要所有4个输入元素,但hdn_partyIdhdn_sessionId元素不会出现在selenium的.page_source中,如果我尝试使用.find_element_by_[...] i获得NoSuchElementException

我甚至检查了所有input元素并列出它们,并且这两个元素没有显示出来。

有没有人知道为什么selenium不会提供与直接查看它所驾驶的浏览器相同的内容?

编辑:澄清......我正在通过Selenium驾驶Chrome与Chromedriver。这不是页面未完全加载的问题。正如我所提到的,我通过python终端逐行手动运行,而不是执行脚本。所以浏览器弹出,加载页面,登录,然后我手动检查浏览器的页面源并查看元素,然后我print driver.page_source,它不存在,如果我运行session_id = driver.find_element_by_id('hdn_sessionId')我得到一个NoSuchElementException。页面中根本没有框架,也没有任何其他窗口。

3 个答案:

答案 0 :(得分:2)

我的一位同事已经找到了问题和解决方法。本质上,在页面加载完成后,它会运行一个清除DOM的javascript命令。浏览器中的“查看页面源”显示的不是当前状态。因此,运行print driver.page_source或使用任何形式的driver.find_element_by_[...]都会从最新且最新鲜的页面数据中提取,而浏览器的“查看页面源”仅显示首次加载页面时提供的内容。如果您在Chrome中开始“检查”该页面,您会看到HTML与浏览器所说的“页面来源”不同。在对Javascript进行逆向工程之后,我们可以运行partyid = driver.execute_script('return accountdata.$partyId.val();')并获取最初分配的内容。我希望这足以帮助其他可能在未来遇到此问题的人。

答案 1 :(得分:0)

如果找到页面的'body',然后使用get_attribute('innerHTML'),则可以访问页面中的所有内容。

答案 2 :(得分:0)

像这样尝试,您将获得源代码关键字“ view-source:”,根据您的浏览器,该关键字可能会有所不同,这是针对Chrome的

driver.get("view-source:"+url)

sourcecode=driver.find_element_by_tag_name('body').text