3

我有这个 PS 脚本,它登录到一个站点,然后导航到另一个页面。

我想保存该页面的整个源代码。但出于某种原因。源代码的某些部分没有遇到。

$username = "myuser" 
$password = "mypass"
$ie = New-Object -com InternetExplorer.Application
$ie.visible=$true
$ie.navigate("http://www.example.com/login.shtml")
while($ie.ReadyState -ne 4) {start-sleep -m 100}
$ie.document.getElementById("username").value = "$username"
$ie.document.getElementById("pass").value = "$password"
$ie.document.getElementById("frmLogin").submit()
start-sleep 5
$ie.navigate("http://www.example.com/thislink.shtml")
$ie.Document.body.outerHTML | Out-File -FilePath c:\sourcecode.txt


这是没有遇到
http://pastebin.com/Kcnht6Ry的代码的pastebin

4

2 回答 2

3

导航后,再次检查就绪状态,而不是使用睡眠。您拥有的相同代码将起作用。

运行代码后出现,如果网站加载缓慢,sleep可能不够长。

while($ie.ReadyState -ne 4) {start-sleep -m 100}

看起来还有另一篇关于此 innerHTML 将 CDATA 转换为评论的帖子看起来有人在该页面上创建了一个函数,您可以在其中清理它。一旦你在代码中声明了函数,它就会是这样的

htmlWithCDATASectionsToHtmlWithout($ie.Document.body.outerHTML) | Out-File -FilePath c:\sourcecode.txt
于 2013-06-11T18:32:58.337 回答
0

我同意@tkrn 关于使用 while 循环等待 IE 文档准备好的观点。为此,我建议在循环内至少使用 2 秒。

while($ie.ReadyState -ne 4) {start-sleep -s 2}

我仍然找到了一种更简单的方法来完全从 URL 获取整个 HTML 源页面。这里是:

$ie.Document.parentWindow.execScript("var JSIEVariable = new XMLSerializer().serializeToString(document);", "javascript")
$obj = $ie.Document.parentWindow.GetType().InvokeMember("JSIEVariable", 4096, $null, $ie.Document.parentWindow, $null)
$HTMLDoc = $obj.ToString()

现在,$HTMLDoc 拥有完整的 HTML 源页面,您可以将其保存为 html 文件。

于 2018-04-12T22:12:41.917 回答