当我从Jenkins运行脚本时,我经常遇到这样的会话错误。它的原因是什么?是否有任何连接失败或是由于其他原因(我运行了大约26个脚本,并且至少有一个脚本没有这样的会话错误)
脚本是不同的脚本,并且不会再为同一个脚本重复此类会话错误
答案 0 :(得分:9)
我有时会遇到这种情况。我使用ChromeDriver和Laravel Dusk,而不是Selenium。但是,我认为原因在于ChromeDriver,而不是Selenium
ChromeDriver会在文件夹中创建一些缓存文件:C:\Users\(yourAccountName)\AppData\Local\Temp
。在此文件夹中,您将看到许多类似scoped_dir1234_5678
的缓存文件夹。每个文件夹大约占用10mb。如果Jenkins经常运行ChromeDriver,ChromeDriver可能会过多填充temp文件夹中的缓存文件。您应该考虑C驱动器上的30-50GB缓存文件并充满C驱动程序。
当我的C盘空间不足时,ChromeDriver将无法启动,然后向我返回错误消息" Facebook \ WebDriver \ Exception \ NoSuchDriverException:没有此类会话"。
解决方案:
<强> - UPDATE - 强>
找出导致问题的另一种情况。
如果您运行相同的脚本在同一操作系统上同时在两个不同的实例中启动ChromeDriver,当一个实例完成并关闭chromedriver时,另一个Chrome浏览器实例也可能会关闭。
例如,您打开两个控制台并执行chromeDriver脚本,或者您的Jenkins项目同时启动。
我相信即使您运行不同的脚本但同时需要chromeDriver,其中一个脚本将具有&#34;没有这样的会话&#34;由于Chrome浏览器实例关闭。
<强>溶液强>
我的案例是使用没有硒的Laravel Dusk。我不确定当测试通过selenium服务器时它是否会有所不同
答案 1 :(得分:3)
WebDriverError: no such session
(Driver info: chromedriver=a.b.c (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4),platform=Mac OS X 10.11.5 x86_64)
或
linux平台上的此错误消息...
WebDriverError: no such session
(Driver info: chromedriver=p.q.r,platform=Linux 3.2.0-4-amd64 x86_64) (Selenium::WebDriver::Error::NoSuchDriverError)
或
windows平台上的此错误消息...
WebDriverError: no such session
(Driver info: chromedriver=x.y.z (52179c1b310fec1797c81ea9a20326839860b7d3),platform=Windows NT 6.1 SP1 x86_64) (NoSuchDriver)
...表示 ChromeDriver 无法与现有的浏览上下文即 Chrome浏览器会话进行通信。
我们已在讨论Issue 732: No such session error - inconsistent problem which appears when running tests for a prolonged period中详细讨论了此问题。通常在延长执行 Test Suite 的时间后,会出现以下错误:
[489.798][DEBUG]: DEVTOOLS EVENT Inspector.targetCrashed {
}
[489.798][INFO]: Waiting for pending navigations...
[489.798][INFO]: Done waiting for pending navigations
[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')
崩溃了是与 Chromium小组进行的WIP( Work In Progress ),现在已经与Linux相关尝试始终将/ dev / shm用于不可执行的内存。这里是参考:
您可以在以下位置找到一些详细的讨论:
答案 2 :(得分:0)
我使用chromediver_binary
和selenium
使用我的python selenium端到端测试遇到了这个问题。尝试多次运行driver.close()
会导致错误。
我意识到我的方法被多次调用,我真正想要的是setUpClass
和tearDownClass
。我会提出我的最终解决方案,因为它避免了这个错误并且很适合我的目的。
class SeleniumTestCase(TestCase):
"""
A wrapper of TestCase which will launch a selenium server, login, and add
cookies in the setUp phase of each test.
"""
@classmethod
def setUpClass(cls, *args, **kwargs):
cls.driver = webdriver.Chrome(port=4444)
cls.driver.implicitly_wait(15)
cls.driver.maximize_window()
cls.driver.get(HOST)
# page obect I wrote which accepts the driver and can login to my app
cls.login = LoginPage(cls.driver)
cls.login.log_into_app()
@classmethod
def tearDownClass(cls):
cls.driver.close()
允许我编写看起来像这样的测试:
class TestNavigation(SeleniumTestCase):
def setUp(self):
# Initialize page objects for each test
self.module1 = Module1Page(self.driver)
self.module2 = Module2Page(self.driver)
# launch page
self.driver.get(HOST)
def test_module1(self):
self.module1.nav_link.click()
self.assertEqual(self.module1.title.text, 'Module One')
def test_module2(self):
self.module2.nav_link.click()
self.assertEqual(self.module2.title.text, 'Module Two')
我在SeleniumTestCase
中进行的初始登录持续通过我运行的所有测试,因此我可以编写测试方法,以便像我以前那样定位单个功能。
答案 3 :(得分:0)
在我的情况下,是在错误的位置调用了driver.quit()。
答案 4 :(得分:0)
nosuchsessionException
检查您的代码是否是您两次调用Driver.close();
或Driver.quit();
或两者都调用。
解决方案:删除一个。