【问题标题】:Parallel.ForEach not completes and issues code when run in ParallelParallel.ForEach 在并行运行时未完成并发出代码
【发布时间】:2016-07-20 07:16:34
【问题描述】:

我想用 DataGridView 用户测试我的网站。

我从 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();
}

首先,任务启动四个进程 Chrome(因为我在 DataTable dtLink 中有四行,但只有 2 或 3 个任务要链接。另一个选项卡将空白页。

其次,只有1个Task可以运行,其他Task在行失败:

browser.FindElementByXPath("//a[contains(@class, 'btn-close')]").Click();

因为它会抛出异常:element not visible

当我只运行 1 个线程时,不会发生此异常。

已解决:

谢谢@IvanStoev!!!

@IvanStoev

看起来您正在为所有人使用同一个浏览器字段 并行任务。只需将其设为局部变量,例如var browser = ...

换行:

browser = new Lapsoft_OneDriver(Browsers.Chrome);

var browser = new Lapsoft_OneDriver(Browsers.Chrome);.

【问题讨论】:

  • 看起来您正在为所有并行任务使用同一个 browser 字段。只需将其设为局部变量,例如var browser = ...
  • 好吧,我不确定您是否应该将 Tasks 与 Parallel.ForEach() stackoverflow.com/a/11565317/585968 混合使用。另外,你不需要等待Task完成吗?
  • @IvanStoev:请添加您的答案。我会投票并接受你的答案是正确的。它为我工作。非常感谢。你能解释一下为什么这样做吗?我通常声明为:Lapsoft_OneDriver browser 并使用它,关键字 var 是否不同?
  • 在本地范围内声明它并没有什么不同。 var browser = ..Lapsoft_OneDriver browser = ... 是一样的。发布答案怎么样,我认为我的评论不值得太多信任,很高兴这有助于并非常感谢您的好意建议:) 请随时将决议发布为自我回答并接受它,这样人们就知道它已经关闭了。
  • 非常感谢。我更新了我的问题已解决,您的答案。

标签: c# multithreading selenium selenium-webdriver parallel-processing


【解决方案1】:
//maximize window// Chrome
ChromeOptions options = new ChromeOptions();
options.AddArgument("--start-maximized");
driver = new ChromeDriver(options);

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

最小化的窗口可能存在问题,因此它无法找到元素,因为它从屏幕“出来”

【讨论】:

  • 我设置在Lapsoft_OneDriver(Browsers.Chrome)。我通过将browser = ... 更改为var browser = ... 解决了我的问题。
猜你喜欢
  • 1970-01-01
  • 2010-11-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-05-05
  • 2014-10-11
  • 2020-05-19
相关资源
最近更新 更多