1

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);

+1

が見えます'すべてのパラレルタスクのフィールド。ローカル変数にするだけです。 'var browser = ...' –

+0

'Task'sを' Parallel.ForEach() 'と混ぜ合わせるべきかどうかは分かりません。http://stackoverflow.com/a/11565317/585968また、 'Task'が完了するのを待つ必要はありませんか? – MickyD

+0

@IvanStoev:あなたの答えを加えてください。私は投票し、あなたの答えを受け入れることが正しいです。それは私のために働いています。どうもありがとうございました。なぜこれを説明できますか?私は通常、 'Lapsoft_OneDriver browser'のように宣言し、それを使用して、キーワード' var'は異なりますか? – vanloc

答えて

1
//maximize window// Chrome 
ChromeOptions options = new ChromeOptions(); 
options.AddArgument("--start-maximized"); 
driver = new ChromeDriver(options); 

//FIREFOX 
driver.Manage().Window.Maximize(); 

あり、それが最小化されている窓が問題になる可能性があり、そのためには、要素を見つける傾ける、それが画面から「アウト」であるので、あなたが一つの同じ `ブラウザを使用しているよう

+1

私は 'Lapsoft_OneDriver(Browsers.Chrome)'に設定していました。私は 'browser = ...'を 'var browser = ...'に変更することで問題を解決しました。 – vanloc