1

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

+1

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 = ...' –

+0

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

+0

@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

Antwort

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

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

Es kann ein Problem mit den Fenstern, es minimiert wird, und daher kann es nicht das Element, weil es

„out“ aus dem Bildschirm ist
+1

Ich habe in 'Lapsoft_OneDriver (Browsers.Chrome)' gesetzt. Ich habe mein Problem gelöst, indem ich 'browser = ...' in 'var browser = ...' ändere. – vanloc