使用BackgroundWorker检查WebBrowser中是否存在元素

5
我正在使用后台工作线程来使用vb.net操纵WebBrowser上的一些元素。
例如,后台工作线程RFIDReader将检查我是否在特定的链接上。
ElseIf TerminalBrowser.Url.ToString.Contains(baseUrl + "box-office/ticket-verification") And rf_code <> "" Then

    ' Insert RF Code in "rf_code" hidden text field
    Me.Invoke(Sub() Me.TerminalBrowser.Document.GetElementById("rf_code").SetAttribute("value", rf_code.ToLower))

End If  

这里发生的是,如果我刷我的RFID卡,它会将相应的值包含到我的浏览器中的rf_code元素中。
现在我想要的是,我想要检查容器本身(synchronize-rfid)是否存在(因为它是一个弹出窗口)。请参考图像。

enter image description here

这是我们的代码。

If Me.TerminalBrowser.Document.GetElementById("synchronize-rfid") IsNot Nothing Then
    ' Code here
end if

参考资料: https://dev59.com/iUvSa4cB1Zd3GeqPcTDY#2022120 问题是,根据上面的代码,BackgroundWorker实际上并没有与UI交互。
有没有办法让我使用后台工作程序确定该元素是否存在?
我认为我已经做到了,但似乎不起作用。
Dim synchronize_rfid = Me.Invoke(Sub() Me.TerminalBrowser.Document.GetElementById("synchronize-rfid"))
If synchronize_rfid IsNot Nothing Then
    ' Code here
end if

“it does not work though” 是什么意思?例如,是否抛出异常,结果不符合预期等? - TnTinMn
@TnTinMn,代码本身并没有检查元素synchronize_rfid是否存在。我尝试在if语句内发送消息框,但它并没有进入其中。 - Wesley Brian Lachenal
Me.Invoke(Sub() Me.TerminalBrowser.Document.GetElementById("synchronize-rfid"))总是返回一个空值,因为子程序不返回任何值。假设TerminalBrowser是正确的引用,那么您需要在Me.Invoke语句中使用lambda函数而不是lambda方法。我之所以说“TerminalBrowser是正确的引用”,是因为您指示该元素位于弹出窗口中,这可能是不同的浏览器实例。 - TnTinMn
不想冒犯,但我注意到你这些天上线了几次。你真的没有时间测试我的答案,还是只是在等赏金结束? - Visual Vincent
@VisualVincent,不是要无礼,我可能过去几天一直在线,但这并不意味着我在工作场所。请假设我在开会/外勤/家里。我还没有测试你的代码,请耐心等待。我不会那么刻薄,不授予我辛苦赚取的声望分数。 - Wesley Brian Lachenal
哦,我很有耐心。只是感觉很奇怪没有收到任何回应,比如评论或其他什么的。我完全理解你还没有时间测试它。 :) - Visual Vincent
1个回答

2

尝试先声明变量,然后在调用时设置它(这将从主线程设置它)。

Sub() lambda 像普通的 Sub()-End Sub 方法一样运作,这意味着您可以在其中执行与分离方法相同的操作。

这对我有效:

Dim synchronize_rfid As HtmlElement
If Me.InvokeRequired = True Then
    Me.Invoke(Sub() synchronize_rfid = Me.TerminalBrowser.Document.GetElementById("synchronize-rfid"))
Else
    synchronize_rfid = Me.TerminalBrowser.Document.GetElementById("synchronize-rfid")
End If

If synchronize_rfid IsNot Nothing Then
    ' Code here
End If

似乎时间不多了,我会在我的测试页面上尝试使用该代码来测试是否存在任何元素。我没有必要的设备来测试我应该真正测试的地方。但它仍然可以工作。这个确实有效,但我有一个问题。如果我将if语句或else语句中的注释/删除,那么它就会出错。 - Wesley Brian Lachenal
哦,没事了。它只是说可能会导致空值,只是警告我而已。不过还是谢谢你。 抱歉回复晚了。由于我正在做几个项目,所以一直没有与您沟通。 - Wesley Brian Lachenal
@WesleyLachenal:哦,真的没有什么急事。我只是检查了一下,因为我觉得没有收到任何回复很奇怪。好吧,我很高兴它对你有用。 :) - Visual Vincent

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接