簡體   English   中英

控制Internet Explorer實例VB.NET

[英]Controlling Internet Explorer instance VB.NET

不久前,我用VBA編寫了一些代碼,該代碼生成了兩個單獨的Internet Explorer會話(每個會話都有自己的Cookie)。

我之前在Visual Studio 2013中使用過表單和IE WebControl,但是發現它與某些站點存在兼容性問題。 這就是為什么我嘗試打開外部瀏覽器,以免出現兼容性問題的原因。

我已將所有必需的引用添加到我的VB.NET項目,並且以下代碼或多或少地運行了沒有問題。 但是,在創建兩個IE實例后,即使利用了visible屬性使它們都可見,也無法使瀏覽器可見。

我在網上找到的大多數示例僅提供使用WebControl的示例,但我試圖避免這樣做。 任何幫助深表感謝。 謝謝!

Imports class SHDocVw
Public Class Form1
Public shellWins As ShellWindows
Public shellWins2 As ShellWindows
Public ie1 As SHDocVw.InternetExplorer
Public ie2 As SHDocVw.InternetExplorer 'New Object
Public ieU As Object
Public ieP As Object
Public ieU2 As Object
Public ieP2 As Object
Public oWin As New Object
Public oWin2 As New Object
Public sh As New Object  


Private Sub Form1_Load(sender As Object, e As EventArgs) Handles MyBase.Load

shellWins = New ShellWindows
shellWins2 = New ShellWindows

ie1 = shellWins.Item(0)
ie1 = New SHDocVw.InternetExplorer
ie1 = shellWins.Item(0)
ie2 = ie1

ie1.Navigate("https://www.SomeSite123.com")
ie1.visible = true

ie2.Navigate("https://www.SomeSite123.com")
ie2.visible = true

ieWait1()
ieWait2()

ieU = ie1.document.getElementById("uName")
ieP = ie1.document.getElementById("uPass")
ieU.Value = "user123"
ieP.value = "Abc123"

ieU2 = ie2,document.getElementById("uPass")
ieP2 = ie2.document.getElementById("uName")
ieU2.Value = "user123"
ieP2.value = "Abc123"   

ieWait1()
ieWait2()


end sub

end class

要使WebBrowser控件使用計算機上最新安裝的IE版本,請參閱以下答案: https : //stackoverflow.com/a/42367088/3740093

至於您得到的錯誤:發生MissingMemberException原因是,您從WebBrowser獲得的HtmlElement對象不包含名為Value的屬性或方法。 要獲取或設置元素的value屬性 ,必須使用HtmlElement.GetAttribute()方法HtmlElement.SetAttribute()方法

對於您的特定情況:

ieU.SetAttribute("value", "user123")
ieP.SetAttribute("value", "Abc123")

另外,我強烈建議您將變量聲明從Object更改為HtmlElement以避免后期綁定和此類錯誤:

Public ieU As HtmlElement
Public ieP As HtmlElement
Public ieU2 As HtmlElement
Public ieP2 As HtmlElement

現在,如果您嘗試訪問不存在的成員,則您的應用程序甚至無法編譯。 這樣省去了調試的麻煩。


最后,我不禁注意到您的ieWait方法。 我只想讓您知道,如果他們正在調用Application.DoEvents() (我敢肯定他們會這樣做),則需要立即擺脫它們! 在99%的不良做法中,使用Application.DoEvents()保持UI響應是正確的做法,因為它幾乎總是被錯誤地使用。

相反,您應該使用WebBrowser.DocumentCompleted事件 ,該事件在每次加載頁面(或頁面中的框架)時引發。

在我的這個答案中,有一個示例您可以如何在內聯代碼中更動態地使用DocumentCompleted事件: https : //stackoverflow.com/a/48110795/3740093

-請注意,您可以在彼此之間使用多個lambda表達式。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM