#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
评论
小型测试用例的代码可能会有所帮助。该错误通常表示chrome和chromedriver之间存在版本不匹配。
问题之一是,登录后chrome打开了一个对话框,要求提供代理凭据。由于此对话框在故障屏幕快照中不可见,因此可以在从节点计算机手动检查后捕获问题。