C# WebBrowser-> Facebooklogin

09/23/2014 08:33 #Saiirex#16
Quote:
Originally Posted by Ammy' View Post
== nicht = ;)
[Only registered and activated users can see links. Click Here To Register...]
09/23/2014 08:39 Ammy'#17
leg mal über dem if aber unter dem foreach nen string an

string className = curElement.GetAttribute("classname").ToString();

und dann im if

If(className == "mrm _42ft _4jy0 _39__ _4jy4 _517h")
{
//code
}
09/23/2014 08:49 Syc#18
Hört sich danach an, als würden die Klammern immer noch fehlen.

Das ToString() sollte aber sowieso unnötig sein.
09/23/2014 09:43 #Saiirex#19
Quote:
Originally Posted by Sycophantic View Post
Hört sich danach an, als würden die Klammern immer noch fehlen.

Das ToString() sollte aber sowieso unnötig sein.
Ups, als das nicht ging hab ich es wieder zurück geändert. Daran lag es!

Neues Problem:
Das Programm loggt sich ein, navigiert zu dem Link, klickt aber nicht auf "Gruppe beitreten"

Der Code bis jetzt:

Code:
using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Threading;

namespace FBGroupJoiner
{
    public partial class Form1 : Form
    {
        //string path;

        public Form1()
        {
            
            InitializeComponent();

        }

        private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.GetElementById("email").InnerText = textBox1.Text;
            webBrowser1.Document.GetElementById("pass").InnerText = textBox2.Text;

            label4.Text = "Login..";
            webBrowser1.Document.GetElementById("loginbutton").InvokeMember("click");
            Thread.Sleep(1000);
            label4.Text = "Navigiere zur Gruppe..";
            webBrowser1.Navigate("https://www.facebook.com/groups/268154400034569/?fref=ts");

            label4.Text = "Tritt der Gruppe bei..";
            Thread.Sleep(1000);
            HtmlElementCollection theElementCollection = default(HtmlElementCollection);
            
            theElementCollection = webBrowser1.Document.GetElementsByTagName("a");
            foreach (HtmlElement curElement in theElementCollection)
            {
                if (curElement.GetAttribute("className").ToString() == "mrm _42ft _4jy0 _39__ _4jy4 _517h")
                {
                    webBrowser1.Navigate(curElement.GetAttribute("ajaxify"));
                }
            }

        }

        private void Form1_Load(object sender, EventArgs e)
        {
            webBrowser1.Navigate("http://de-de.facebook.com");
            Thread.Sleep(2000);        
        }

        private void button2_Click(object sender, EventArgs e)
        {
            
            //openFileDialog1.ShowDialog();
            //path = openFileDialog1.FileName;
            //textBox3.Text = path;

        }
    }
}
09/23/2014 09:52 Ammy'#20
Mach nen Extrabutton für Gruppe beitreten, die Funktion zum drücken des "Gruppe beitreten"-Buttons wird schon während dem laden der Seite ausgeführt = er "drückt" einen noch nicht existent knopf.
09/23/2014 09:57 #Saiirex#21
Ich würde das gerne automatisieren.
Wenn ich warten würde bis sich der Browser vollständig geladen hat, würde nix passieren, weil der Browser nie fertig wird.

Habe mal:

Code:
if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
{
MessageBox.Show("Fertig");
}
probiert. Die MessageBox ist nie aufgegangen.
09/23/2014 10:00 Ammy'#22
Also du machst ne neue Funktion die das Gruppe Beitreten ausführt. Dann nimmst nen Timer und prüfst bei jedem tick ob der Webbrowser fertig geladen hat. Wenn ja dann führst du die Funktio aus, wenn nicht eben nicht. Und den Timer dann einfach unendlich loopen lassen / bis er das erste mal der Gruppe beigetreten ist.


Edit: Zu deinem MessageBox-Versuch

Ich versuchs mal relativ einfach zu erklären:

Also die Funktion geht von oben nach unten deinen Code durch und führt eben diesen aus. Wenn du jetzt den Webbrowser lädst und danach den Readycheck machst, wird er klar sagen "Ne is net ready" weil der Code ausgeführt wird aber nicht wartet weil der Code nur sagt "navigiere zu" und nicht "navigiere und warte bis fertig" :P
09/23/2014 10:08 #Saiirex#23
Quote:
Originally Posted by Ammy' View Post
Also du machst ne neue Funktion die das Gruppe Beitreten ausführt. Dann nimmst nen Timer und prüfst bei jedem tick ob der Webbrowser fertig geladen hat. Wenn ja dann führst du die Funktio aus, wenn nicht eben nicht. Und den Timer dann einfach unendlich loopen lassen / bis er das erste mal der Gruppe beigetreten ist.
Okay das überfordert mich jetzt. Soweit bin ich noch nicht mit C# :D.

Kannst du vlt ein Codebeispiel posten?
09/23/2014 10:14 Ammy'#24
Code:
        
private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.GetElementById("email").InnerText = textBox1.Text;
            webBrowser1.Document.GetElementById("pass").InnerText = textBox2.Text;

            label4.Text = "Login..";
            webBrowser1.Document.GetElementById("loginbutton").InvokeMember("click");
            Thread.Sleep(1000);
            label4.Text = "Navigiere zur Gruppe..";
            webBrowser1.Navigate("https://www.facebook.com/groups/268154400034569/?fref=ts");

            label4.Text = "Tritt der Gruppe bei..";
            Thread.Sleep(1000);
           timer1.Enabled = true;

        }

 private void timer1_Tick(object sender, EventArgs e)
        {
            if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
            {
                timer1.Enabled = false;
                HtmlElementCollection theElementCollection = default(HtmlElementCollection);

                theElementCollection = webBrowser1.Document.GetElementsByTagName("a");
                foreach (HtmlElement curElement in theElementCollection)
                {
                    if (curElement.GetAttribute("className").ToString() == "mrm _42ft _4jy0 _39__ _4jy4 _517h")
                    {
                        webBrowser1.Navigate(curElement.GetAttribute("ajaxify"));
                    }
                }
            }
        }
Sollte gehen o: Nicht vergessen nen Timer auf die Form zu ziehen / einen per Code zu erstellen
09/23/2014 10:18 #Saiirex#25
Quote:
Originally Posted by Ammy' View Post
Code:
        
private void button1_Click(object sender, EventArgs e)
        {
            webBrowser1.Document.GetElementById("email").InnerText = textBox1.Text;
            webBrowser1.Document.GetElementById("pass").InnerText = textBox2.Text;

            label4.Text = "Login..";
            webBrowser1.Document.GetElementById("loginbutton").InvokeMember("click");
            Thread.Sleep(1000);
            label4.Text = "Navigiere zur Gruppe..";
            webBrowser1.Navigate("https://www.facebook.com/groups/268154400034569/?fref=ts");

            label4.Text = "Tritt der Gruppe bei..";
            Thread.Sleep(1000);
           timer1.Enabled = true;

        }

 private void timer1_Tick(object sender, EventArgs e)
        {
            if (webBrowser1.ReadyState == WebBrowserReadyState.Complete)
            {
                timer1.Enabled = false;
                HtmlElementCollection theElementCollection = default(HtmlElementCollection);

                theElementCollection = webBrowser1.Document.GetElementsByTagName("a");
                foreach (HtmlElement curElement in theElementCollection)
                {
                    if (curElement.GetAttribute("className").ToString() == "mrm _42ft _4jy0 _39__ _4jy4 _517h")
                    {
                        webBrowser1.Navigate(curElement.GetAttribute("ajaxify"));
                    }
                }
            }
        }
Sollte gehen o: Nicht vergessen nen Timer auf die Form zu ziehen / einen per Code zu erstellen
Macht der Timer dann "Thread.Sleep" überflüssig?
09/23/2014 10:19 Ammy'#26
Ja. Hab nur dein Code gecopyed deshalb vergessen das raus zu nehmen

An die Procoder: Bin selbst noch neu also falls was unsauber seien sollte bitte mit korrigieren :P
09/23/2014 10:24 #Saiirex#27
Es funktioniert nicht.. Der Tritt der Gruppe nicht bei. Ich glaube weil , "WebBrowser.ReadyState.Complete" nie eintritt.
09/23/2014 10:28 Ammy'#28
Versuchs mal mit == WebBrowserReadyState.Loaded und nicht complete

(keine Garantie, hab 0 Ahnung vom WebBrowser)
09/23/2014 10:31 #Saiirex#29
Quote:
Originally Posted by Ammy' View Post
Versuchs mal mit == WebBrowserReadyState.Loaded und nicht complete

(keine Garantie, hab 0 Ahnung vom WebBrowser)
Nope, es tut sich nichts.
09/23/2014 10:35 Ammy'#30
Grad was gefunden

[Only registered and activated users can see links. Click Here To Register...]

diese Methode führst du dann im TimerTick aus also

Code:
 private void timer1_Tick(object sender, EventArgs e)
  {
     webBrowser1_DocumentCompleted();
  }
und bei der Methode sieht das dann so aus

Code:
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e) {
     //This line is so you only do the event once   
     if (e.Url != webBrowser1.Url) 
       {
         return;
       }

    else
      {        
                timer1.Enabled = false;
                HtmlElementCollection theElementCollection = default(HtmlElementCollection);

                theElementCollection = webBrowser1.Document.GetElementsByTagName("a");
                foreach (HtmlElement curElement in theElementCollection)
                {
                    if (curElement.GetAttribute("className").ToString() == "mrm _42ft _4jy0 _39__ _4jy4 _517h")
                    {
                        webBrowser1.Navigate(curElement.GetAttribute("ajaxify"));
                    }
                }      
      }


    }

Ps: meine Formatierung sieht kacke aus ich weiß ^^