@samodelkin1990

Как в c# сделать несколько кликов в браузере в треде?

Хочу сделать автоклики в браузере по ссылкам. Вот код:
/*
 * Created by SharpDevelop.
 * User: Любовь
 * Date: 04.06.2015
 * Time: 7:25
 * 
 * To change this template use Tools | Options | Coding | Edit Standard Headers.
 */
using System;
using System.Collections.Generic;
using System.Drawing;
using System.Threading;
using System.Windows.Forms;

namespace AutoClicker
{
	/// <summary>
	/// Description of MainForm.
	/// </summary>
	public partial class MainForm : Form
	{
		
		public MainForm()
		{
			//
			// The InitializeComponent() call is required for Windows Forms designer support.
			//
			InitializeComponent();
			Thread t = new Thread(clicks);
			t.Start();
		}
		
		
		
		public void clicks()
		{
			
			Thread.Sleep(5000);			
			
			//Клик по ссылке "правила"
			clickOnTheLink(webBrowser1,"правила");
			
			Thread.Sleep(5000);

			//Клик по ссылке "о сайте"
			clickOnTheLink(webBrowser1,"о сайте");

		}		
		
		
		//Клик по ссылке с текстом
		public void clickOnTheLink(WebBrowser webBrowser, String s)
		{
			HtmlElementCollection elements = webBrowser.Document.GetElementsByTagName("a");
			Console.Beep();
			foreach(HtmlElement a in elements)
				if (a.InnerText == s)
					a.InvokeMember("click");
		}
	}
}


При первом вызове в потоке метода clickOnTheLink появляется окно с вот такой ошибкой:

System.InvalidCastException: Заданное приведение является недопустимым.

в System.Windows.Forms.UnsafeNativeMethods.IHTMLDocument2.GetLocation()
в System.Windows.Forms.WebBrowser.get_Document()
в AutoClicker.MainForm.clickOnTheLink(WebBrowser webBrowser, String s) в c:\Users\Любовь\Documents\SharpDevelop Projects\AutoClicker\MainForm.cs:строка 54
в AutoClicker.MainForm.clicks() в c:\Users\Любовь\Documents\SharpDevelop Projects\AutoClicker\MainForm.cs:строка 41
в System.Threading.ThreadHelper.ThreadStart_Context(Object state)
в System.Threading.ExecutionContext.RunInternal(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state, Boolean preserveSyncCtx)
в System.Threading.ExecutionContext.Run(ExecutionContext executionContext, ContextCallback callback, Object state)
в System.Threading.ThreadHelper.ThreadStart()


Подскажите, как быть?
  • Вопрос задан
  • 949 просмотров
Пригласить эксперта
Ответы на вопрос 1
artem_b89
@artem_b89
Сетевой бездельник
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 WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
            webBrowser1.Navigate("http://habrahabr.ru");
            Thread t = new Thread(clicks);
            t.Start();
        }
        public void clicks()
        {

            Thread.Sleep(5000);

            //Клик по ссылке "правила"

            this.Invoke(new ClickIt( clickOnTheLink),new object[] { webBrowser1, "Хабрахабр"});

            Thread.Sleep(5000);

            //Клик по ссылке "о сайте"
            this.Invoke(new ClickIt(clickOnTheLink), new object[] { webBrowser1, "Тостер" });
            

        }
        private delegate void ClickIt(WebBrowser webBrowser, String s);
                
        //Клик по ссылке с текстом
        public void clickOnTheLink(WebBrowser webBrowser, String s)
        {
            HtmlElementCollection elements = webBrowser.Document.GetElementsByTagName("a");
            Console.Beep();
            foreach (HtmlElement a in elements)
                if (a.InnerText == s)
                    a.InvokeMember("click");
        }
    }
}
Ответ написан
Комментировать
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы