浏览器自动化的一些体会8 访问angular页面的一个问题
發(fā)現(xiàn)瀏覽器自動(dòng)化有一個(gè)重要方面沒有提及,即所謂的無頁面瀏覽器,不過最近沒有需求,不想嘗試,先記上一筆,以后有需求時(shí),可以有個(gè)思路。
大約一兩個(gè)月前(現(xiàn)在比較懶散,時(shí)間不知不覺過去,連今天是幾號(hào)有時(shí)候都搞糊涂),碰到一個(gè)問題,本來程序中用WebBrowser控件訪問一個(gè)頁面,現(xiàn)在那個(gè)頁面用Angular重寫了,訪問出錯(cuò),出來一個(gè)空白頁面。
1。解決方案一是改注冊(cè)表,修改webBrowser控件所模擬的IE版本,缺省是7,不支持Angular,改成高版本,如11,就可以了。
但是有個(gè)問題,只能在第一次創(chuàng)建webBrowser時(shí)生效,如果要改回來,對(duì)不起,只能重啟程序。應(yīng)用中有多處用了webBrowser控件,如果這里改成11,別處也要用11,那么,就需要測(cè)試所有用到的地方,看頁面的顯示是否正常,測(cè)試工作量太大,不可行。
2。解決方案二是用別的控件。找到一個(gè)口碑似乎不錯(cuò)的CefSharp,測(cè)試了一下,工作正常。
但是問題來了,首先是工程設(shè)置成AnyCPU,CefSharp需要配置。調(diào)試了一段時(shí)間,也可以了。
更大的問題來了,工程需要用click once方式部署,結(jié)果,那些dll發(fā)布不出去。查了半天,調(diào)試了半天,想盡了辦法,還是不行。最后唯一的辦法似乎只有用Mage.exe和MageUI.exe這兩個(gè)windows sdk里的工具,手工修改clickonce的manifest,把需要的dll打包進(jìn)去。太煩,也不可行。
3。情急之下想出第三方案,用一個(gè)獨(dú)立的包含webBrowser控件的exe顯示頁面,然后在另一個(gè)winform主程序中,把這個(gè)exe內(nèi)嵌到form上的一個(gè)panel控件里:
var handle = Process.GetProcessesByName("foo")[0].MainWindowHandle;
SetParent(handle, this.Handle);
SetWindowLong(handle, (int)GWL_STYLE, (uint)WS_VISIBLE);
MoveWindow(handle, 0, 0, this.Width, this.Height, true);
foo就是那個(gè)exe,用了一些windows api,P/Invoke的簽名不難從網(wǎng)上找到。
試了下,似乎可行。顯然,很野蠻很丑陋。
4。最后有頭腦靈活的高人想出巧妙的解決辦法:
using (FileStream fs = File.Create(path))
??????????????????????? {
??????????????????????????? using (StreamWriter sw = new StreamWriter(fs, Encoding.UTF8))
??????????????????????????? {
??????????????????????????????? sw.WriteLine("<html>");
??????????????????????????????? sw.WriteLine("<head>");
??????????????????????????????? sw.WriteLine("<meta http-equiv='X-UA-Compatible' content='IE=edge' />");
??????????????????????????????? sw.WriteLine("<iframe style='width:1500px;height:900px;' src='" + url + "'></iframe>");
??????????????????????????????? sw.WriteLine("</head>");
??????????????????????????????? sw.WriteLine("</html> ");
??????????????????????????? }
??????????????????????? }
??? ????????????????}
??????????????????? webBrowser1.Navigate(path);
手工創(chuàng)建一個(gè)頁面,關(guān)鍵是<meta http-equiv='X-UA-Compatible' content='IE=edge' />這一句,然后用iframe放那個(gè)Angular的頁面,用webBrower控件訪問文件,就可以了。確實(shí)是高招,自愧不如。
轉(zhuǎn)載于:https://www.cnblogs.com/badnumber/p/11087619.html
總結(jié)
以上是生活随笔為你收集整理的浏览器自动化的一些体会8 访问angular页面的一个问题的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: Java基础--多线程
- 下一篇: 请你讲一讲JavaScript有哪些数据