我很遗憾无法发布代码来重现此问题,因为它涉及登录不是公共网站的网站。但我的问题比代码问题更普遍。实际上,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_partyId
和hdn_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
。页面中根本没有框架,也没有任何其他窗口。
答案 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