C# InvokeMember("клик") не работает! Youtube как

Мне нужна серьезная помощь. Я собираюсь написать инструмент, который автоматически входит в аккаунты YouTube из текстового файла, а затем посещает ссылку на видео и любит это видео. Моя проблема в том, что он не любит видео и выскакивает ошибка

(Необработанное исключение типа 'System.NullReferenceException' произошло в Youtube.exe.

Дополнительная информация: ссылка на объект не установлена ​​для экземпляра объекта.)

Вот как выглядит мой код:

    using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Web;
using System.IO;

namespace YouBot
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        int h = 0;

        private void button1_Click(object sender, EventArgs e)
        {
            richTextBox1.Text = String.Empty;
            OpenFileDialog p = new OpenFileDialog();
            p.Filter = "Account list (*.txt)|*.txt";
            if (p.ShowDialog() == DialogResult.OK)
            {
                textBox1.Text = p.FileName;
                FileStream fs;
                StreamReader sr;
                string dateiName = textBox1.Text;
                string zeile;

                if (!File.Exists(textBox1.Text))
                {
                    MessageBox.Show("This file does not exist!", "YouBot Error", MessageBoxButtons.OK, MessageBoxIcon.Error);
                    return;
                }

                fs = new FileStream(textBox1.Text, FileMode.Open);
                sr = new StreamReader(fs);

                while (sr.Peek() != -1)
                {
                    zeile = sr.ReadLine();
                    richTextBox1.Text += zeile + "\n";
                }
                sr.Close();
            }
        }

        int loadedFramesCount = 0;
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            loadedFramesCount += 1;
            bool done = true;
            if (webBrowser1.Document != null)
            {
                HtmlWindow win = webBrowser1.Document.Window;
                //check if are frames to be loaded and if they all loaded already
                if (win.Frames.Count > loadedFramesCount && win.Frames.Count > 0) done = false;
            }
            if (done && webBrowser1.ReadyState == WebBrowserReadyState.Complete && !webBrowser1.IsBusy)
            {
                //you can always wait some seconds at this step, 
                //just to ensure html injection, that could take some miliseconds

                //Now you can preform the next operation
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            FileStream fs;
            StreamReader sr;
            string dateiName = textBox1.Text;
            string zeile;
            fs = new FileStream(textBox1.Text, FileMode.Open);
            sr = new StreamReader(fs);

            while (sr.Peek() != -1)
            {
                h = h + 1;
                zeile = sr.ReadLine();
                string[] credentials = zeile.Split(':');
                //string name = credentials[0];
                //string pass = credentials[1];
                webBrowser1.Document.GetElementById("Email").SetAttribute("value", credentials[0]);
                webBrowser1.Document.GetElementById("Passwd").SetAttribute("value", credentials[1]);
                webBrowser1.Document.GetElementById("signIn").InvokeMember("click");
            }
            sr.Close();
            webBrowser1.Navigate(textBox2.Text);
            webBrowser1.Document.GetElementById("watch-like").InvokeMember("click");

        }
    }

}

1 ответ

Хорошо, проблема может заключаться в том, что когда вы вызываете member('click') или перемещаетесь, вы не дожидаетесь полной загрузки страницы, некоторые части страницы могут быть введены из вызова ajax или чего-то другого, и это может быть не в документ, когда вы переходите к следующему шагу.

Просто попробуйте дождаться окончания документа,

У меня была проблема, как у вас несколько лет назад, и я решил с помощью события webbrowser DocumentCompleted

//Before any operation like navigate or invokemember('click'), 
//set loadedFramesCount = 0;

//loadedFramesCount is going to be used to control the amount of loaded frames
//because each time a frame is loaded, this event is fired, and we want the full documentcompleted
int loadedFramesCount = 0;
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{
    loadedFramesCount += 1;
    bool done = true;
    if (webBrowser1.Document != null)
    {
        HtmlWindow win = webBrowser1.Document.Window;
        //check if are frames to be loaded and if they all loaded already
        if (win.Frames.Count > loadedFramesCount && win.Frames.Count > 0) done = false;
    }
    if (done && webBrowser1.ReadyState == WebBrowserReadyState.Complete && !browser.IsBusy)
    {
        //you can always wait some seconds at this step, 
        //just to ensure html injection, that could take some miliseconds

        //Now you can preform the next operation
    }
{

Теперь вам просто нужно создать метод, который ожидает полного завершения документа (просмотр логического значения или что-то в этом роде) и вызывать метод после каждой навигации или вызова члена ('click')

ОБНОВИТЬ

Я имел в виду что-то вроде этого,

        int loadedFramesCount = 0;
        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
            loadedFramesCount += 1;
            bool done = true;
            if (webBrowser1.Document != null)
            {
                HtmlWindow win = webBrowser1.Document.Window;
                //check if are frames to be loaded and if they all loaded already
                if (win.Frames.Count > loadedFramesCount && win.Frames.Count > 0) done = false;
            }
            if (done && webBrowser1.ReadyState == WebBrowserReadyState.Complete && !webBrowser1.IsBusy)
            {
                //you can always wait some seconds at this step, 
                //just to ensure html injection, that could take some miliseconds

                //Now you can preform the next operation
                doccompleted = true; 
            }
        }

        private void button2_Click(object sender, EventArgs e)
        {
            FileStream fs;
            StreamReader sr;
            string dateiName = textBox1.Text;
            string zeile;
            fs = new FileStream(textBox1.Text, FileMode.Open);
            sr = new StreamReader(fs);

            while (sr.Peek() != -1)
            {
                h = h + 1;
                zeile = sr.ReadLine();
                string[] credentials = zeile.Split(':');
                //string name = credentials[0];
                //string pass = credentials[1];
                webBrowser1.Document.GetElementById("Email").SetAttribute("value", credentials[0]);
                webBrowser1.Document.GetElementById("Passwd").SetAttribute("value", credentials[1]);
                webBrowser1.Document.GetElementById("signIn").InvokeMember("click");
                WaitDocumentCompleted();
                webBrowser1.Navigate(textBox2.Text);
                WaitDocumentCompleted();
                webBrowser1.Document.GetElementById("watch-like").InvokeMember("click");
                WaitDocumentCompleted();
            }
            sr.Close();


        }
    }

    bool doccompleted = false;
    public void WaitDocumentCompleted()
    {
        while(!doccompleted)
        {
            //this could be a bit of a kill, but there are other ways to wait...
            Thread.Sleep(1000);
        }
        doccompleted = false;
        loadedFramesCount = 0;
    }

попробуй так.

Другие вопросы по тегам