【发布时间】: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