我对selenium并不陌生,在使用selenium 2.41和chrome 2.9x进行测试时,我在chrome浏览器中面临“超时从渲染器接收消息”的问题。我已经尝试了许多测试来重现此问题,但是发生的不一致。此问题有什么具体原因吗?。

评论

小型测试用例的代码可能会有所帮助。

该错误通常表示chrome和chromedriver之间存在版本不匹配。

问题之一是,登录后chrome打开了一个对话框,要求提供代理凭据。由于此对话框在故障屏幕快照中不可见,因此可以在从节点计算机手动检查后捕获问题。

#1 楼

看来此问题已被记录为Selenium的错误,但尚未得到解决:
问题402:Webdriver在页面加载时挂起,无法将控制权交还给脚本执行

正在寻找特定的repro,也许您可​​以通过发布特定的repro来帮助他们?

有人报告说,从其代码中删除任何驱动程序超时选项可以解决问题:

//driver.manage().timeouts().implicitlyWait(2000, TimeUnit.MILLISECONDS);
//driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);
//driver.manage().timeouts().setScriptTimeout(60, TimeUnit.SECONDS);


评论


是的,这个回答对我也有帮助;

– eugene.polschikov
17年1月3日在10:58

没有任何超时选项即可工作:字符串webDriverURL =“ http://” + environmentData.getHubIP()+“:” + environmentData.getHubPort()+“ / wd / hub”;驱动程序=新的RemoteWebDriver(新的URL(webDriverURL),功能); // driver.manage()。timeouts()。implicitlyWait(50,TimeUnit.SECONDS); // driver.manage()。timeouts()。pageLoadTimeout(50,TimeUnit.SECONDS); driver.manage()。window()。setSize(new Dimension(1920,1080));

– eugene.polschikov
17年1月3日在11:00

但是,您如何处理超时?尽管在日志消息中显示[SEVERE]看起来对我来说一切都很好...除了在日志中显示烦人的输出

–朱塞佩
20-5-20在17:53

#2 楼

我并不是说这是解决方案,但我想在调查一天之后分享我的经验。我们网站的问题实际上是由于使用Google标记(GTM)时第三方加载页面源所花费的时间。可以通过添加Chrome扩展程序(如Ghostery)并屏蔽所有标记来忽略此问题。或者更好的是,您可以要求开发人员关闭预生产产品上的标记。使用前一种方法,您可以按以下方式使用Ghostery加载chrome配置文件。

DesiredCapabilities capabilitiesChrome = DesiredCapabilities.chrome();
        ChromeOptions options = new ChromeOptions();
        options.addArguments("--always-authorize-plugins");
        options.addArguments("load-extension=C:/Users/hemanand.rajamani/AppData/Local/Google/Chrome/User Data/Default/Extensions/mlomiejdfkolichcflejclcbmpeaniij/7.1.0.49_0");
        options.addArguments("user-data-dir=C:/Users/hemanand.rajamani/AppData/Local/Google/Chrome/User Data/Default");
        capabilitiesChrome.setCapability(ChromeOptions.CAPABILITY,options);
        try {
            desiredBrowser = new RemoteWebDriver(new URL("http://" + hubHost + ":" + hubPort + "/wd/hub"),
                    capabilitiesChrome);

        } catch (MalformedURLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }


希望对您有所帮助。

#3 楼

因此,我已经解决了这个问题,但是我的解决方案是一个糟糕的hack。它唯一要做的就是它已经奏效,至少对我们而言。这是代码:

这是解决方案中心的代码:

webdriver.get('about://blank')
my_script = 'var a = document.createElement("a");' \
            'var linkText = document.createTextNode("%s");' \
            'a.appendChild(linkText);' \
            'a.title = "%s";' \
            'a.href = "%s";' \
            'document.body.appendChild(a);' % \
            (url_to_use, url_to_use, url_to_use)
webdriver.execute_script(my_script)
webdriver.set_page_load_timeout(20)
webdriver.click_element_by_text('css=a', url_to_use)
if page.loaded() is False:
    webdriver.click_element_by_text('css=a', url_to_use)
if page.loaded() is False:
    webdriver.click_element_by_text('css=a', url_to_use)
if page.loaded() is False:
    webdriver.click_element_by_text('css=a', url_to_use)


这里的详细信息: http://testautomationarchitecture.blogspot.com/2016/10/python-selenium-and-dreaded-timed-out.html

评论


您的博客文章不错,但是您可以在此处将解决方案的要点添加到答案中。我们更喜欢在答案的主体中提供解决方案的重要方面,并提供更多详细信息。

–凯特·保罗(Kate Paulk)
16-10-12在19:39

我认为解决方案的重点是“ webdriver.set_page_load_timeout(20)”

– han058
20 Mar 18 '20 at 2:18

您可能会认为,但是您会错。我们只是尝试了这一点。在提出此解决方案之前,我花了几个月的时间作为背景任务。就像我说的,这确实是一个可怕的骇客。但是GUI自动化中最大的问题之一是同步...自从我们做到了这一点以来,它再没有发生过。

–阿基恩·麦克莱恩(Akien MacIain)
20 May 14 '18:45



#4 楼

最后,感谢您的答复,我解决了它,它删除了一些插件,并在开始测试之前屏蔽了一些第三方广告。

解决方案1:
有些插件(例如Flash Player)可能会挂起浏览器在测试运行期间不一致地等待​​某些资源,请尝试在使用chrome开关启动测试时禁用此类插件。
http://peter.sh/experiments/chromium-command-line-switches/

解决方案2:
浏览器可能会挂起,等待一些第三方广告。
请尝试使用某些广告拦截器扩展程序禁用广告,或使用自定义代理配置来拦截网址格式。

对于不一致的浏览器挂起,请尝试查找哪个进程将浏览器挂起。
1.与Firefox不同,chrome为浏览器,选项卡,扩展名和插件创建单独的进程。
2.何时浏览器挂起,检查是否有任何新进程(shift + Esc),例如Web Worker:blob,并附加了第三方网址,然后按照#2
3 .;否则,如果为插件打开了更多单独的进程,请尝试#1

#5 楼

我已经处理了这个问题大约6个月了,每次我都希望在下一次更新中可以解决此问题,但事实并非如此。

因此,为了节省遇到相同或相似问题的其他人的时间,问题是由于某些原因,页面没有完全加载,最终将超时。

我首先尝试在以后使用计时器运行代码,但这也没有太大帮助。

我发现最好的工作解决方案是创建自己的扩展程序,它所做的只是停止页面:


{
  "manifest_version": 2,
  "name": "Amir's Extension",
  "version": "1.0.0",
  "content_scripts": [
    {
      "all_frames": true,
      "matches": ["*://*/*"],
      "js": ["content.js"],
      "run_at": "document_start"
    }
  ]
}


,并在content.js文件中:

setTimeout(() => {window.stop()}, 10000);
setInterval(() => {window.stop()}, 20000);


所以我还需要启用它:

Path currentRelativePath = Paths.get("");
String s = currentRelativePath.toAbsolutePath().toString();
chromeOpt.addArguments("--load-extension="+s+"/stopper");


嗯!我还没有一个超时问题!

#6 楼

我将分享我的案例:

我在使用ChromeDriver 2.21.371459和Google Chrome 48.0.2564.116的Django硒测试(django == 1.7.12和selenium == 2.53.1)中遇到了这个问题。

我能够找出问题所在。就我而言,它仅在我的自定义本地cdn域上引用静态文件(例如HTML标记中的图像,例如http://cdn.local.myproject.net/static/myimage.png)的页面发生。如果我使用相对路径“ /static/myimage.png”或本地主机“ http://127.0.0.1/static/myimage.png”,则该问题不存在,因此我认为这是DNS问题。

我可以使用chrome的--dns-prefetch-disable选项绕过此问题。

Python中的示例:

from selenium.webdriver import Chrome
from selenium.webdriver.chrome.options import Options

chrome_options = Options()
chrome_options.add_argument('--dns-prefetch-disable')
driver = Chrome(chrome_options=options)


我没有知道这是否是一般情况,但希望对您有所帮助。

#7 楼

尝试捕获此超时异常:

    try{
     // your code with timeout exception
    } catch {
      case e: Throwable => {

        println(Console.RED + "  Alert-окно! " + Console.RESET)

        // println(Console.MAGENTA_B + "press..." + Console.RESET); Console.in.readLine()

        try {
          println("  13 alert. close trying ")
          println("e.getCause: " + e.getCause)
          remote20.switchTo().alert().accept()
          remote20.manage().timeouts().implicitlyWait(50, TimeUnit.SECONDS)
          remote20.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS)
        } catch {
          case e: Throwable => {
            println("  13 alert. no alert-window")
          }
        }
        // println(Console.MAGENTA_B + "press..." + Console.RESET); Console.in.readLine()

      }
    }


#8 楼

这是因为页面加载时间较长,您需要在chromedriver选项中添加其他行。请参考以下链接以获取更多信息:
在硒中从渲染器接收消息超时

#9 楼

driver.manage().timeouts().implicitlyWait(2000, TimeUnit.MILLISECONDS);
driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);


在我的代码中,使用了以上两行,并注释了第二行,它工作正常。

//driver.manage().timeouts().pageLoadTimeout(40, TimeUnit.SECONDS);


评论


这是对原始问题的评论,也可能是新问题的评论-我不确定是哪个问题,但不适合作为答案。

–凯特·保罗(Kate Paulk)
15年6月23日在11:05

我不认为这是对所提问题的答案。您能否以这个内容来解释您试图传达的内容?

–IAmMilinPatel
15年7月10日在17:08

在我的情况下,建议的解决方案甚至不起作用

–朱塞佩
20 May 20 '17:50

#10 楼

要在Jenkins Headless模式下并行执行测试用例,请使用以下命令

options.addArguments("--no-sandbox"); 
options.addArguments("--disable-dev-shm-usage"); 
options.addArguments("--aggressive-cache-discard"); 
options.addArguments("--disable-cache"); 
options.addArguments("--disable-application-cache"); 
options.addArguments("--disable-offline-load-stale-cache"); 
options.addArguments("--disk-cache-size=0");
 options.addArguments("--headless"); 
options.addArguments("--disable-gpu"); 
options.addArguments("--dns-prefetch-disable"); 
options.addArguments("--no-proxy-server"); 
options.addArguments("--log-level=3"); 
options.addArguments("--silent"); 
options.addArguments("--disable-browser-side-navigation"); options.setPageLoadStrategy(PageLoadStrategy.NORMAL); 
options.setProxy(null);


评论


这如何回答原始问题?另外,不需要这些参数中的大多数即可无头运行驱动程序。

– Niels van Reijmersdal
20年1月6日,12:54