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

cro*_*eaf 6 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>
Run Code Online (Sandbox Code Playgroud)

然而,我需要所有4个输入元素,hdn_partyId并且hdn_sessionId元素不会出现在selenium中.page_source,如果我尝试使用它们,.find_element_by_[...]我会得到一个NoSuchElementException

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

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

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

cro*_*eaf 8

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

  • 上下文菜单中的“查看页面源”显示服务器返回的 HTML,而命令“driver.page_source”返回浏览器构建的实际 HTML。我想我们都假设您正在谈论开发人员工具的“元素”选项卡中显示的源(上下文菜单中的“检查”)。其实这不是问题,你只是看错地方了。所以最后,“driver.page_source”返回的 HTML **确实匹配**它所驱动的浏览器中显示的内容。 (2认同)

小智 6

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

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

sourcecode=driver.find_element_by_tag_name('body').text
Run Code Online (Sandbox Code Playgroud)