GeckoWebBrowser auto login *help*

03/31/2018 12:52 -Universe-#1

Hallo, ich bin gerade dabei ein neues Projekt zu starten und stecke an folgendes fest:

Auto Login auf https Site (Ogame.de)
Nach Programm Start soll er die Website erstmal komplett laden und danach den Login() abfeuern
Er soll die Login Daten aus einer TextBox lesen und den Server aus der ComboBox.

"Main Form"
Code:
Imports Gecko
Imports Gecko.Events
Imports System.IO

Public Class Main
    Sub New()
        InitializeComponent()
        Xpcom.Initialize(Environment.CurrentDirectory + "/xulrunner")
    End Sub

    Dim UC As New UserConfig

#Region "GeckoWebBrowser"
    Private Sub Main_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        GeckoWebBrowser1.Navigate("https://de.ogame.gameforge.com")
        GeckoWebBrowser1.Navigate("javascript:void(document.getElementsByTagName('iframe')[0].setAttribute('src', 'about:blank'))")
    End Sub
#End Region

#Region "Login"
    Public Sub Login()
        GeckoWebBrowser1.Document.GetElementById("usernameLogin").SetAttribute("value", Settings.FlatTextBox1.Text)
        GeckoWebBrowser1.Document.GetElementById("passwordLogin").SetAttribute("value", Settings.FlatTextBox2.Text)
        SelectServer()
    End Sub

    Public Sub SelectServer()
        Dim dropdown = GeckoWebBrowser1.Document.GetElementsByTagName("option")
        dropdown(Settings.FlatComboBox1.TabIndex).SetAttribute("selected", "selected")
    End Sub
#End Region

    Private Sub FlatButton1_Click(sender As Object, e As EventArgs) Handles FlatButton1.Click
        Settings.Show()
    End Sub
End Class
So wie der Code jetzt da steht, startet er das Programm ganz normal und Gecko navigiert ohne probleme auf die URL

ABER

wenn ich jetzt die Login() sub in Main_Load schreibe, gibt er sofort folgende Fehlermeldung:
Quote:
System.NullReferenceException: 'Object reference not set to an instance of an object.'
Mit Verweis auf die Public Sub Login()

Soweit mir bekannt ist und ich nicht falsch liege, fehlt mir ein Addhandler und DocumentCompleted ?
Ich hatte das vor 2 Jahren mal zum laufen gebracht aber bin zulange raus und mir fällt einfach nicht ein was und wo der fehler ist:confused:

UserConfig wo der Code zum Speichern der Daten drin steht, sieht wie folgt aus:

Code:
Imports Gecko
Imports Skybound.Gecko
Imports System.IO

Public Class UserConfig

    Dim Gecko As New Gecko.GeckoWebBrowser
    Dim sPath As String = ".\Resources"
    Dim filepath As String = ".\Resources\Config\cfg.ini"


#Region "Create Folder & File"
    Public Sub CreateFile()
        If Not System.IO.File.Exists(filepath) Then
            System.IO.File.Create(filepath).Dispose()
        End If
    End Sub

    Public Sub CreateFolder()
        If (My.Computer.FileSystem.DirectoryExists(sPath) = False) Then
            My.Computer.FileSystem.CreateDirectory(sPath + "/Config")
        Else
           'Something else happens, because the folder exists
        End If
    End Sub
#End Region



#Region "Script Save and Load"

    'Only important for Coder

    Private Declare Ansi Function GetPrivateProfileString Lib "kernel32.dll" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Int32, ByVal lpFileName As String) As Int32
    Private Declare Ansi Function WritePrivateProfileString Lib "kernel32.dll" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As String, ByVal lpString As String, ByVal lpFileName As String) As Int32


    Public Function INI_ReadValueFromFile(ByVal strSection As String, ByVal strKey As String, ByVal strDefault As String, ByVal strFile As String) As String
        Dim strTemp As String = Space(1024), lLength As Integer
        lLength = GetPrivateProfileString(strSection, strKey, strDefault, strTemp, strTemp.Length, strFile)
        Return (strTemp.Substring(0, lLength))
    End Function

    Public Function INI_WriteValueToFile(ByVal strSection As String, ByVal strKey As String, ByVal strValue As String, ByVal strFile As String) As Boolean
        Return (Not (WritePrivateProfileString(strSection, strKey, strValue, strFile) = 0))
    End Function

#Region "Save"
    Public Sub SaveUserSettings()
        INI_WriteValueToFile("User Data", "AccountName", Settings.FlatTextBox1.Text, ".\Resources\Config\cfg.ini")
        INI_WriteValueToFile("User Data", "AccountPasswort", Settings.FlatTextBox2.Text, ".\Resources\Config\cfg.ini")
        INI_WriteValueToFile("User Data", "ServerID", Settings.FlatComboBox1.SelectedItem, ".\Resources\Config\cfg.ini")
    End Sub
#End Region

#Region "Load"
    Public Sub LoadUserSettings()
        Settings.FlatTextBox1.Text = INI_ReadValueFromFile("User Data", "AccountName", "", ".\Resources\Config\cfg.ini")
        Settings.FlatTextBox2.Text = INI_ReadValueFromFile("User Data", "AccountPasswort", "", ".\Resources\Config\cfg.ini")
        Settings.FlatComboBox1.SelectedItem = INI_ReadValueFromFile("User Data", "ServerID", "", ".\Resources\Config\cfg.ini")
    End Sub
#End Region
#End Region

End Class
Wenn Ihr mehr Info's braucht, einfach schreiben! 8)

Thanks alot buddys :handsdown:


03/31/2018 13:20 Serraniel#2
#moved


Bezüglich des Nullpointer Fehlers: Du versuchst halt Elemente im Dom zu finden, welche existieren weil die Website in der Schnelle kaum fertig geladen haben kann. Dadurch sind die Elemente im DOM nicht vorhanden und können nicht gefunden werden und somit in deinem Code null. Ein DocumentCompleted Handler ist hier das was du brauchst, wie du selber schon sagtest. Der Login an sicht funktioniert technisch, z. B. wenn du die Login per Button press aufrufst?

Im Allgemeinen würde ich dir zusätzlich aber davon abraten, nen Webbrowser zu verwenden und stattdessen einfach mit Webrequests zu arbeiten, die entsprechende Posts und Gets an den Server senden. Das spart deutlich Resourcen gegenüber eines Webbrowsers und du bist nciht abhängig von deren DOM-Struktur.
04/03/2018 04:36 Nanoxx™#3
Mit CefSharp ist es einfacher...

Für Username / PW
PHP Code:
CEF.ExecuteScriptAsync("document.getElementById('usernameLogin').value = 'Username';"
Und für den Server
PHP Code:
document.getElementById('serverLogin').value '
                                                                                            Aquarius                                                                                    '