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;
}
попробуй так.