Ich möchte meine Website mit einem DataGridView-Benutzer testen.Parallel.ForEach wird nicht abgeschlossen und gibt Code aus, wenn es parallel ausgeführt wird
Und ich n-Thread von n-Konto in DataGridView erstellen und zur gleichen Zeit ausführen, um Fehler zu testen.
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();
}
Zunächst startet der Task vier Prozess Chrome (weil ich in Datatable dtLink
vier Reihen haben, aber nur 2 oder 3 Aufgabe auf einen Link wird. Eine andere Registerkarte leere Seite.
Zweitens nur Aufgabe 1 kann andere Aufgabe ausgeführt wird in Zeile fehlgeschlagen:
browser.FindElementByXPath("//a[contains(@class, 'btn-close')]").Click();
Weil es eine Ausnahme auslöst. element not visible
Wenn ich nur 1 Thread ausführe, tritt diese Ausnahme nicht auf.
BESCHLOSSEN:
Dank @IvanStoev !!!
@IvanStoev
Sieht aus wie Sie ein und denselben Browser Feld für alle parallele Aufgaben verwenden. Machen Sie es einfach zu einer lokalen Variable, z.
var browser = ...
Zeile ändern:
browser = new Lapsoft_OneDriver(Browsers.Chrome);
zu
var browser = new Lapsoft_OneDriver(Browsers.Chrome);
.
wie Sie ein verwenden Looks und den gleichen 'Browser 'Feld für alle parallelen Aufgaben. Machen Sie es einfach zu einer lokalen Variable, z. 'var browser = ...' –
Nun, ich bin mir nicht sicher, dass Sie 'Task' mit' Parallel.ForEach() 'http://stackoverflow.com/a/11565317/585968 mischen sollten. Müssen Sie nicht warten, bis die Aufgabe abgeschlossen ist? – MickyD
@IvanStoev: Bitte fügen Sie Ihre Antwort hinzu. Ich stimme und akzeptiere deine Antworten richtig. Es funktioniert für mich. Vielen Dank. Kannst du erklären warum? Normalerweise deklariere ich: 'Lapsoft_OneDriver browser' und benutze das Schlüsselwort' var' anders? – vanloc