DataGridViewユーザーで自分のWebサイトをテストしたい。Parallel.ForEachが完了せず、パラレルで実行するとコードが発行される
DataGridViewでn個のアカウントからn個のスレッドを作成し、同時に実行してバグをテストします。
private void btnStartProgram_Click(object sender, EventArgs e)
{
Task.Factory.StartNew(() =>
Parallel.ForEach(dtLink.AsEnumerable(), items =>
OpenNRowsInData(items["username"].ToString(), items["password"].ToString())));
}
private string link = "http://localhost/laravelapp1/login";
private void OpenNRowsInData(string username, string password)
{
browser = new Lapsoft_OneDriver(Browsers.Chrome);
browser.GoToUrl(link);
while (browser.FindElementByXPath("//a[contains(@class, 'btn-close')]") == null)
Thread.Sleep(50);
if (browser.FindElementByXPath("//a[contains(@class, 'btn-close')]") != null)
browser.FindElementByXPath("//a[contains(@class, 'btn-close')]").Click();
browser.FindElementById("txtUserName").SendKeys(username);
browser.FindElementById("txtpassword").SendKeys(password);
browser.FindElementById("btnlogin").Click();
}
まず、私はDataTableのdtLink
で4行を持っているが、わずか2または3のタスクがリンクに起こっているため、タスクは、4つのプロセスChromeを(起動するには。別のタブになる空白のページ。
第二に、のみそれは例外スローので
browser.FindElementByXPath("//a[contains(@class, 'btn-close')]").Click();
:実行することができます1つのタスクは、他のタスクが行で失敗している。element not visible
を
1つのスレッドのみを実行すると、この例外は発生しません。
は解決済み:
おかげ@IvanStoev!あなたはすべての 並列タスク用と同じブラウザのフィールドを使用しているよう
@IvanStoev
が見えます。ローカル変数にするだけです。
var browser = ...
変更ライン:
var browser = new Lapsoft_OneDriver(Browsers.Chrome);
へ
browser = new Lapsoft_OneDriver(Browsers.Chrome);
。
が見えます'すべてのパラレルタスクのフィールド。ローカル変数にするだけです。 'var browser = ...' –
'Task'sを' Parallel.ForEach() 'と混ぜ合わせるべきかどうかは分かりません。http://stackoverflow.com/a/11565317/585968また、 'Task'が完了するのを待つ必要はありませんか? – MickyD
@IvanStoev:あなたの答えを加えてください。私は投票し、あなたの答えを受け入れることが正しいです。それは私のために働いています。どうもありがとうございました。なぜこれを説明できますか?私は通常、 'Lapsoft_OneDriver browser'のように宣言し、それを使用して、キーワード' var'は異なりますか? – vanloc