2016-02-12 16 views
5

Używam robotnik w tle do manipulowania niektóre elementy w moim WebBrowser przy użyciu vb.net.Sprawdź, czy element istnieje w WebBrowser przy użyciu BackgroundWorker

Na przykład pracownik w tle RFIDReader sprawdzi, czy jestem na określonym łączu.

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 

Co się dzieje tutaj, jeśli dotknę mojej karty RFID. Obejmuje to odpowiednią wartość do mojego elementu rf_code w mojej przeglądarce.

Teraz chcę się przekonać, czy istnieje sam kontener (synchronize-rfid) (ponieważ jest to pop-up). Zobacz zdjęcie w celach informacyjnych.

enter image description here

Oto nasz kod do tego.

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

referencyjny: https://stackoverflow.com/a/2022120/1699388

Problem polega na tym, BackgroundWorker naprawdę nie wchodzi w interakcje z UI jak na powyższym kodzie.

Czy istnieje metoda dla mnie, aby ustalić, czy ten element istnieje za pomocą pracownika tła?

Myślę, że zrobiłem to i to nie działa.

Dim synchronize_rfid = Me.Invoke(Sub() Me.TerminalBrowser.Document.GetElementById("synchronize-rfid")) 
If synchronize_rfid IsNot Nothing Then 
    ' Code here 
end if 
+0

Co oznacza „to nie działa choć” oznacza? czyli wyjątek zgłoszony, a nie oczekiwany wynik itp.? – TnTinMn

+0

@TnTinMn, sam kod nie sprawdza, czy istnieje element 'synchronize_rfid'. Próbowałem wysłać okno komunikatu wewnątrz instrukcji if, ale nie wchodzi ono w. –

+0

'Me.Invoke (Sub() Me.TerminalBrowser.Document.GetElementById (" synchronize-rfid "))' zawsze zwróci wartość Nic, ponieważ podprogram nie zwraca wartości. Zakładając, że TerminalBrowser jest właściwym odniesieniem, musisz użyć metody lambda w funkcji lambda w twoim poleceniu 'Me.Invoke'. Powodem, dla którego mówię, że "TerminalBrowser jest właściwym odniesieniem" jest to, że wskazujesz, że element jest w wyskakującym okienku i może to być inna instancja przeglądarki. – TnTinMn

Odpowiedz

2

Spróbuj najpierw zadeklarować zmienną, a następnie ustawić ją podczas wywołania (która ustawi ją z głównego wątku).

Sub() lambda zachowuje się jak normalny Sub() - End Sub metody, która oznacza, że ​​można zrobić to samo, co tam jak gdyby osobną metodę.

Działa to dla mnie:

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 
+0

Wydaje się, że czas się kończy, zrobię to na mojej dummy stronie tylko po to, aby sprawdzić, czy jakiś element istnieje za pomocą tego kodu.Nie mam niezbędnego sprzętu do testowania, gdzie powinienem go naprawdę przetestować. Ale działa tak po prostu. Ten naprawdę działa, ale mam pytanie. Jeśli albo komentarz/usunięty wewnątrz instrukcji if lub else, to jednak błędy. –

+0

Ohh, nevermind. Powiedział tylko, że może to spowodować wartość zerową, po prostu mnie ostrzegł. W każdym razie dzięki. Moja zła za późną odpowiedź. Nie komunikowałem się z tobą, ponieważ nie testowałem tego, robiąc kilka projektów. –

+0

@WesleyLachenal: Och, naprawdę nie było pośpiechu. Właśnie sprawdziłem, ponieważ wydawało mi się dziwne, że nie otrzymałem żadnej odpowiedzi. Cóż, cieszę się, że to dla ciebie zadziałało. :) –

Powiązane problemy