本文介绍了双轨并行任务时死亡情况的webdriver的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我看到一些死者实例怪事运行使用硒的webdriver,简单的例子是,比如并行嵌套循环网络压力测试,打每100次展示300独特的网页。



我成功获得4 - 8 webdriver的情况下使用将一个的ThreadLocal< FirefoxWebDriver> 来隔离它们每个任务线程,并MaxDegreeOfParallelism在ParallelOptions实例限制螺纹。我在的ThreadLocal<分区,只有并行外环(页面的集合),并检查 .IsValueCreated ;> 每个分区的长期运行的任务方法的开头容器内。为了便于以后清理,我每一个新的实例添加到由线程ID键控ConcurrentDictionary。



不管我用什么并行化或分区策略,webdriver的情况下,偶尔会做一以下内容:




  • 启动,但从来没有显示一个URL或运行一个印象

  • 启动,运行任何展示次数罚款,然后只是闲置在某个时刻



在其中任一发生,并行循环的最后的似乎注意到一个线程没有做任何事情,它产生一个新的分区。如果的 N 的是允许的线程数量,这导致其的 N 的生产线只是时间约为50-60%。



清理仍然工作在最后罚款;有可能2n个打开的浏览器或以上,但生产性和非生产性的人都得到清理。



有没有一种方法来监视这些无用的webdriver实例和)清除它们向右走,加上B)得到并行循环立即更换任务段,而不是落后了好几分钟,因为它往往现在呢?


解决方案

Thanks to your suggestion, I've implemented IsReady functionality in my open-source project Webinator. Use that if you want, or use the code outlined below.

I tried instantiating 25 instances, and all of them were functional, so I'm pretty confident in the algorithm at this point (I leverage HtmlAgilityPack to see if elements exist, but I'll skip it for the sake of simplicity here):

public void WaitForReady(IWebDriver driver)
{
    var js = @"{ var temp=document.createElement('div'); temp.id='browserReady';" +
             @"b=document.getElementsByTagName('body')[0]; b.appendChild(temp); }";
    ((IJavaScriptExecutor)driver).ExecuteScript(js);

    WaitForSuccess(() =>
    {
        IWebElement element = null;
        try
        {
            element = driver.FindElement(By.Id("browserReady"));
        }
        catch
        {
            // element not found
        }

        return element != null;
    },
    timeoutInMilliseconds: 10000);

    js = @"{var temp=document.getElementById('browserReady');" +
         @" temp.parentNode.removeChild(temp);}";
    ((IJavaScriptExecutor)driver).ExecuteScript(js);
}

private bool WaitForSuccess(Func<bool> action, int timeoutInMilliseconds)
{
    if (action == null) return false;

    bool success;
    const int PollRate = 250;
    var maxTries = timeoutInMilliseconds / PollRate;
    int tries = 0;
    do
    {
        success = action();
        tries++;
        if (!success && tries <= maxTries)
        {
            Thread.Sleep(PollRate);
        }
    }
    while (!success && tries < maxTries);
    return success;
}

The assumption is if the browser is responding to javascript functions and is finding elements, then it's probably a reliable instance and ready to be used.

这篇关于双轨并行任务时死亡情况的webdriver的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持!

10-29 16:25