Автоматический вход на сайт: SetAttribute не работает - PullRequest
0 голосов
/ 03 января 2019

Я создаю инструментальную панель программы, и одна особенность заключается в том, что пользователь автоматически входит на сайт сайта с использованием сохраненных учетных данных в программе (не нужно открывать Chrome или FF).

В программе:Ожидание задержки задачи работает, я вижу, что поля имени пользователя и пароля заполняются до отправки (щелчка), но когда он пытается отправить запрос, браузер, встроенный в форму, работает так, как будто страница пуста и учетные данные не введены?Я должен упомянуть, что я вижу имя пользователя и пароль, введенные в форму, но страница ведет себя так, как будто ничего не было введено.Что я здесь не так делаю?

Примечание: кнопка на сайте, к которому мы подключаемся, не имеет идентификатора элемента, отображается только тип ... отсюда и обходной путь для Invokemember ("Click")

Любая помощь приветствуется.

    Public Class Form1
Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
    Label3.Visible = False
End Sub
Private Function login_thesite() As Task

    WebBrowser1.Document.GetElementById("username").SetAttribute("value", "Username")
    WebBrowser1.Document.GetElementById("Password").SetAttribute("value", "Password")


    Dim allelements As HtmlElementCollection = WebBrowser1.Document.All
    For Each webpageelement As HtmlElement In allelements
        If webpageelement.GetAttribute("type") = "submit" Then
            webpageelement.InvokeMember("click")
        End If
    Next

End Function

Private Property pageready As Boolean = False

    #Region "Page Loading Functions"
Private Sub WaitForPageLoad()
    AddHandler WebBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    While Not pageready
        Application.DoEvents()
    End While
    pageready = False
End Sub

Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
        pageready = True
        RemoveHandler WebBrowser1.DocumentCompleted, New WebBrowserDocumentCompletedEventHandler(AddressOf PageWaiter)
    End If
End Sub

    #End Region

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    If CheckBox1.Checked = True Then
        login_thesite()
        WaitForPageLoad()
    End If

End Sub
Private Sub CheckBox1_CheckedChanged(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles CheckBox1.CheckedChanged

    TextBox1.Text = ""
    TextBox2.Text = ""
    Label3.Visible = True
    WebBrowser1.Navigate("https://thesite.com/#/login")
    WaitForPageLoad()
End Sub
End Class     

1 Ответ

0 голосов
/ 04 января 2019

Вам не нужна никакая async процедура здесь. Событие WebBrowser.DocumentCompleted уже вызывается асинхронно. DoEvents() одинаково бесполезен, если не разрушителен.

Вам просто нужно подписаться на событие DocumentCompleted и вызвать метод Navigate, чтобы веб-браузер мог загрузить удаленный ресурс Html.

Когда HtmlDocument будет наконец загружен, WebBrowser сообщит о своем завершении, установив его состояние в WebBrowserReadyState.Complete.

Об элементе ввода HTML и формах :
здесь код предполагает, что в этом HtmlDocument есть только одна форма.
Это может быть так, но это не так. HTML-документ может иметь более одной формы, и каждый фрейм может иметь свой собственный документ. У IFrames наверняка будет по одному.

Прочтите примечания в этом ответе (код C #, но вам просто нужны заметки) для получения дополнительной информации о том, как обрабатывать несколько кадров / IFrames


Button1 подключит событие DocumentCompleted и вызовет Navigate().
Когда Документ завершен, код в обработчике событий запустится и выполнит процедуру входа в систему.
Затем обработчик событий удаляется, так как он завершил свою задачу, и вам все еще нужно использовать WebBrowser для других целей.

Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
    Button1.Enabled = False
    WebSiteLogIn()
End Sub

Private Sub WebSiteLogIn()
    AddHandler WebBrowser1.DocumentCompleted, AddressOf PageWaiter
    WebBrowser1.Navigate("https://thesite.com/#/login")    
End Sub

Private Sub PageWaiter(ByVal sender As Object, ByVal e As WebBrowserDocumentCompletedEventArgs)
    If WebBrowser1.ReadyState = WebBrowserReadyState.Complete Then
        WebBrowser1.Document.GetElementById("username").SetAttribute("value", "Username")
        WebBrowser1.Document.GetElementById("Password").SetAttribute("value", "Password")

        Dim allInputElements = WebBrowser1.Document.Body.All.
            Cast(Of HtmlElement).Where(Function(h) h.TagName.Equals("INPUT")).ToList()

        For Each element As HtmlElement In allInputElements
            If element.GetAttribute("type").ToUpper().Equals("SUBMIT") Then
                element.InvokeMember("click")
            End If
        Next

        RemoveHandler WebBrowser1.DocumentCompleted, AddressOf PageWaiter
        Button1.Enabled = True
    End If
End Sub
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...