我试图对我的网页进行自动化测试,并且我正在使用Jasmine与硒一起使用。
在测试镀铬(使用镀铬液)时,我不可预测地得到下面的错误。它经常发生,当我运行一个测试套件时,它几乎没有完成。
我发现了这个错误的证据但是找不到可靠的答案:https://bugs.chromium.org/p/chromedriver/issues/detail?id=732(授予这是铬,我使用铬)
WebDriverError: no such session
(Driver info: chromedriver=2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.11.5 x86_64)
at WebDriverError (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/error.js:27:10)
at Object.checkLegacyResponse (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/error.js:639:15)
at parseHttpResponse (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/http/index.js:538:13)
at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/http/index.js:472:11
at ManagedPromise.invokeCallback_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:1379:14)
at TaskQueue.execute_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2913:14)
at TaskQueue.executeNext_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2896:21)
at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2820:25
at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:639:7
at process._tickCallback (node.js:369:9)
From: Task: WebElement.isDisplayed()
at Driver.schedule (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/webdriver.js:377:17)
at WebElement.schedule_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/webdriver.js:1744:25)
at WebElement.isDisplayed (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/webdriver.js:2110:17)
at driver.findElements.then.error (/Users/XXXXXXX/Documents/sweetmeeting/Test/front_end_testing/spec/dashboard_tester.js:251:34)
at ManagedPromise.invokeCallback_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:1379:14)
at TaskQueue.execute_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2913:14)
at TaskQueue.executeNext_ (/Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2896:21)
at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:2775:27
at /Users/XXXXXXX/Documents/sweetmeeting/node_modules/selenium-webdriver/lib/promise.js:639:7
at process._tickCallback (node.js:369:9)
答案 0 :(得分:9)
我们也一直在努力解决这个问题很长一段时间,并且最近已经解决了这个问题,所以我想在这里发布它可以帮助其他人。
原来我们知道它与记忆有关。我们在docker容器内运行测试,docker默认dev / shm大小为64mb。增加这个解决了我们的“没有这样的会话”问题。
我们使用docker compose,所以只需将shm_size:256M添加到docker-compose.yml文件中。
答案 1 :(得分:6)
我最近也遇到过这个例外。它首先似乎也是不确定的,但经过彻底的调查后,我意识到如果你调用ChromeDriver.Close()然后尝试FindElement,它就会确定地发生。
就我而言,ChromeDriver.Close()是在之前的测试的异常处理程序中调用的,该测试由于计时问题而发生。这只会影响 next 测试,所以它增加了这个问题的缺点。但正如我所说,我的调查显示它是确定性的。
话虽如此,这是我对该错误的体验。可能是你的情况不同......
答案 2 :(得分:0)
有时候,我们只是希望任何问题都非常复杂,并且在问题可能如此明显的情况下,寻找问题的原因太深了。
当我在browser.close()
方法中显式调用logout()
作为异常处理程序时,我看到了这个问题。它终止了会话,并且随后的所有量角器测试都引发了此错误。
一旦我移除了browser.close()
并抛出一个错误,问题就解决了。
答案 3 :(得分:0)
此错误消息...
WebDriverError: no such session
(Driver info: chromedriver=a.b.c (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.11.5 x86_64)
...表示 ChromeDriver 无法与现有的浏览上下文即 Chrome浏览器会话进行通信。
我们已经在讨论Issue 732: No such session error - inconsistent problem which appears when running tests for a prolonged period中讨论并分析了此问题。通常在延长执行 Test Suite 的时间后,会出现以下错误:
[0127/105308:ERROR:nacl_helper_linux.cc(289)] NaCl helper process running without a sandbox!
Most likely you need to configure your SUID sandbox correctly
[489.849][INFO]: RESPONSE FindElements unknown error: session deleted because of page crash
from tab crashed
(Session info: chrome=p.q.r.s)
[489.849][DEBUG]: Log type 'driver' lost 0 entries on destruction
[489.849][DEBUG]: Log type 'browser' lost 9 entries on destruction
此错误在nacl_helper_linux.cc中的定义如下:
// If the Zygote has started handling requests, we should be sandboxed via
// the setuid sandbox.
if (!IsSandboxed()) {
LOG(ERROR) << "NaCl helper process running without a sandbox!\n"
<< "Most likely you need to configure your SUID sandbox "
<< "correctly";
由于{em>沙盒问题,精确地FindElement(s)
方法已失败,而由于Page Crash
由于多种原因而可能发生此错误,并且解决此错误的解决方案如下:
--disable-impl-side-painting
启动配置 ChromeDriver 的 Chrome 会话
--enable-gpu-rasterization
,该参数允许试探法确定何时应使用Skia GPU后端绘制图层图块。仅在GPU加速合成+侧面绘画时有效。--force-gpu-rasterization
,该参数始终使用Skia GPU后端绘制图层图块。仅在GPU加速合成+侧面绘画时有效。覆盖kEnableGpuRasterization
标志。当服务器无法识别唯一的会话标识符时,也会观察到此错误。如果通过以下两种方式之一删除了会话或会话ID无效,则会发生这种情况:
Explicit session deletion:按如下所示显式调用quit()
方法时,将显式删除WebDriver会话:
from selenium import webdriver
from selenium.common.exceptions import InvalidSessionIdException
driver = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
print("Current session is {}".format(driver.session_id))
driver.quit()
try:
driver.get("https://www.google.com/")
except Exception as e:
print(e.message)
#Console Output:
Current session is a9272550-c4e5-450f-883d-553d337eed48
No active session with ID a9272550-c4e5-450f-883d-553d337eed48
Implicit session deletion:如下所示,当您关闭最后一个调用close()
方法的窗口或选项卡时,将隐式删除WebDriver会话:
driver = webdriver.Chrome(executable_path=r'C:\Utility\BrowserDrivers\chromedriver.exe')
print("Current session is {}".format(driver.session_id))
# closes current window/tab
driver.close()
try:
driver.get("https://www.google.com/")
except Exception as e:
print(e.message)
#Console Output:
Current session is a9272550-c4e5-450f-883d-553d337eed48
No active session with ID a9272550-c4e5-450f-883d-553d337eed48
您可能还需要添加参数 --no-sandbox
/dev/shm
太小,Chrome似乎经常在某些页面的Docker容器中崩溃。同样,您可能必须修复较小的/dev/shm
大小。一个例子:
sudo mount -t tmpfs -o rw,nosuid,nodev,noexec,relatime,size=512M tmpfs /dev/shm
如果您使用-v /dev/shm:/dev/shm
选项共享 host /dev/shm
使其生效的另一种方法是将chrome_options
添加为 --disable-dev-shm-usage
。这将强制Chrome使用/tmp
目录。尽管这会减慢执行速度,因为将使用磁盘而不是内存。
chrome_options.add_argument('--disable-dev-shm-usage')
您可以在以下位置找到一些详细的讨论: