PDA

View Full Version : مشکل در اجرای Thread و یک فرم اینترنتی



siampour
چهارشنبه 26 فروردین 1394, 17:09 عصر
سلام من یه مشکلی دارم

توی یک webBrowser توی تابع DocumentCompleted یعنی بعد از لود کامل صفحه یه چیزی نوشتم که یک فرم ورود را پر کنه (یوزر نیم و پسورد ) و روی دکمه ورود کلیک کنه یعنی یه صفحه اینترنتی هست که یوزر نیم و پسورد میخواد .جوری نوشتم که یوزر نیم و پسورد را وارد کنه بعد روی دکمه ورود کلیک کنه . ولی پر کردن input یوزر پسورد و کلیک ورود همزمان اتفاق میفته برای همین اطلاعات درست فرستاده نمیشه . ولی وقتی قسمت کلیک را از کد حذف میکنم و دستی روی ورود کلیک میکنم به درستی وارد میشه . از اسلیپ ترد استفاده کردم ولی انجام نمیشه

و یه سوال دیگه : اگه بخوام یه تابع هر چند ثانیه یه بار به طور منظم اجرا بشه چی کار باید بکنم ؟؟

private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("input"))
{
if (item.GetAttribute("name") == "Username")
{
item.SetAttribute("Value", "admin");
}
if (item.GetAttribute("name") == "Password")
{
item.SetAttribute("Value", "123");
}


}
Thread.Sleep(1000);
foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("input"))
{
if (item.GetAttribute("name") == "signin")
{
item.InvokeMember("Click");
}

}}

plus
چهارشنبه 26 فروردین 1394, 17:32 عصر
قاعدتا نباید اینطوری باشه ولی به هر حال شما کد مروبط به کلیک رو در BeginInvoke قرار بدین شاید حل شد:

this.BeginInvoke((MethodInvoker)delegate {
foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("input") )
{
if (item.GetAttribute("name") == "signin")
{
item.InvokeMember("Click");
}

}
});

در مورد سوال دوم هم میتونید از کنترل Timer و یا کلاس System.Timers.Timer (https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx) استفاده کنید.

siampour
چهارشنبه 26 فروردین 1394, 19:50 عصر
قاعدتا نباید اینطوری باشه ولی به هر حال شما کد مروبط به کلیک رو در BeginInvoke قرار بدین شاید حل شد:

this.BeginInvoke((MethodInvoker)delegate {
foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("input") )
{
if (item.GetAttribute("name") == "signin")
{
item.InvokeMember("Click");
}

}
});

در مورد سوال دوم هم میتونید از کنترل Timer و یا کلاس System.Timers.Timer (https://msdn.microsoft.com/en-us/library/system.timers.timer(v=vs.110).aspx) استفاده کنید.

اون مشکل اول حل شد مرسی

در مورد دومی ازSystem.Timers.Timer (https://msdn.microsoft.com/en-us/library/system.timers.timer%28v=vs.110%29.aspx) استفاده کردم ولی مثلا من گذاشتم روی یک ثانیه یه بار ولی انگار پشت سر هم انجام میده و یه ثانیه صبر نمیکنه

توی مثال هایی که دیدم static تعریف کرده بود .

ولی چون توی این متد من نمیشد من استاتیک تعریف نکردم .


using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Windows.Forms;
using System.Timers;

namespace WindowsFormsApplication2
{
public partial class Form1 : Form
{
System.Timers.Timer timer;


public Form1()
{
timer = new System.Timers.Timer(1000);
InitializeComponent();
webBrowser1.Navigate("http://isy.ir/");
timer.Elapsed += OnTimedEvent;
timer.Enabled = true;

}
void OnTimedEvent(Object source, ElapsedEventArgs e)
{
webBrowser1.Navigate("http://isy.ir");
}
private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
{

String str = webBrowser1.DocumentText.ToString();

if (str.Contains("در دسترس"))
{

}
else
{
this.BeginInvoke((MethodInvoker)delegate
{
foreach (HtmlElement item in webBrowser1.Document.GetElementsByTagName("input"))
{
if (item.GetAttribute("name") == "signin")
{
item.InvokeMember("Click");
}

}
});

}
}


private void Form1_Load(object sender, EventArgs e)
{

}
}
}

plus
چهارشنبه 26 فروردین 1394, 20:31 عصر
اگه قراره در فرم باشه و با کنترل ها در ارتباط باشه بهتره از کنترل Timer (میتونید از Toolbox یک شی ازش ایجاد کنید) بجای اون کلاس استفاده کنید.