下面发布的解决方案 - TLDR;这愚蠢地使用 presence_of_element_ located 与错误的用例,然后不考虑浏览器和驱动程序不同步。
问题:测试在本地通过但通过 Jenkins 失败的问题。
本地总是通过(windows VM)
Jenkins 有时会通过(Windows VM)
本地测试和 Jenkins 测试都在同一虚拟机(Windows 代理)上运行。我遵循了这些人的建议,添加了以下参数,但没有改变/成功:
options = Options()
options.add_experimental_option('excludeSwitches', ['enable-logging']) #Fixes the problem with console outputing warning "Bluetooth: bluetooth_adapter_winrt.cc:1074 Getting Default Adapter failed."
options.add_argument('--no-sandbox')
options.add_argument("enable-automation")
#options.add_argument("--headless") #CAUSES TIMEOUT ERROR
options.add_argument("--window-size=1920,1080")
options.add_argument("--disable-extensions")
options.add_argument("--dns-prefetch-disable")
options.add_argument("--disable-gpu")
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--disable-browser-side-navigation")
options.add_argument("--force-device-scale-factor=1")
prefs = {"download.default_directory" : r"C:\Users\MyUser\Path\Directory\\"}
options.add_experimental_option("prefs", prefs)
s = Service('chromeDriverPath/chromedriver.exe')
context.driver = webdriver.Chrome(service=s, options=options,desired_capabilities=capa)
--headless
选项会产生错误:
Timed out receiving message from renderer: 10.000
所以我已经评论了。
问题: 为什么我的本地总是通过,但我的 Jenkins 不稳定,即使它们在同一个虚拟机上运行测试。我该如何解决这个问题?
背景
我看过this类似的问题,但没有解决方案。不幸的是我花了很多时间试图解决这个问题。
已安装的软件包版本 (PIP)
Package Version
--------------------- ---------
allure-behave 2.9.45
allure-python-commons 2.9.45
async-generator 1.10
attrs 21.4.0
behave 1.2.6
cairocffi 1.3.0
CairoSVG 2.5.2
certifi 2022.6.15
cffi 1.15.1
charset-normalizer 2.1.0
chromedriver 2.24.1
click 8.1.3
colorama 0.4.5
cryptography 37.0.4
cssselect2 0.6.0
defusedxml 0.7.1
et-xmlfile 1.1.0
h11 0.13.0
idna 3.3
lxml 4.9.1
multipledispatch 0.6.0
numpy 1.23.1
openpyxl 3.0.10
outcome 1.2.0
pandas 1.4.3
parse 1.19.0
parse-type 0.6.0
Pillow 9.2.0
pip 22.0.4
pluggy 1.0.0
pycparser 2.21
pygal 3.0.0
pyOpenSSL 22.0.0
pypiwin32 223
pyshadow 0.0.4
PySocks 1.7.1
python-dateutil 2.8.2
python-docx 0.8.11
python-dotenv 0.20.0
pytz 2022.1
pywin32 304
requests 2.28.1
selenium 4.3.0
setuptools 58.1.0
six 1.16.0
sniffio 1.2.0
sortedcontainers 2.4.0
tinycss2 1.1.1
trio 0.21.0
trio-websocket 0.9.2
urllib3 1.26.10
webdriver-manager 3.8.1
webencodings 0.5.1
wsproto 1.1.0
更新 08/02/2022 4:11pm
添加更多隐式和显式等待时间修复了许多不稳定的测试
更新 08/03/2022 8:20am 解决方案
示例
之前
WebDriverWait(context.driver, 10).until(EC.presence_of_element_located((By.CSS_SELECTOR, '{$path}')))
之后
WebDriverWait(context.driver, 60).until(EC.visibility_of_element_located((By.CSS_SELECTOR, '{$path}')))
总结
使用正确的预期条件很重要。我什至不得不将我的其中一个更改为element_to_be_clickable 以使其不不稳定。这是一个涉及等待可点击元素弹出的测试。确保阅读文档并使用最适合的预期条件以避免错误。另外,如果出现异步错误,请考虑延长隐式或显式等待时间。失败时的屏幕截图可以帮助您调试此问题。
windows系统,因此您需要删除参数:
options.add_argument("--disable-gpu")
作为论点仅对非Windows环境有效,不再相关。
options.add_argument("enable-automation")
options.add_argument("--disable-extensions")
jenkins测试应以非root/非管理员用户身份执行,因此您可能不需要参数:
options.add_argument('--no-sandbox')
options.add_argument("--disable-dev-shm-usage")
options.add_argument("--dns-prefetch-disable")
options.add_argument("--disable-browser-side-navigation")
options.add_argument("--force-device-scale-factor=1")
prefs = {"download.default_directory" : r'C:\Users\MyUser\Path\Directory\'}
options.add_experimental_option("prefs", prefs)
capabilities
,因此您可以从构造函数中删除参数:
desired_capabilities=capa
options = Options()
options.add_argument("--headless")
options.add_argument("--window-size=1920,1080")
options.add_experimental_option('excludeSwitches', ['enable-logging'])
options.add_experimental_option("excludeSwitches", ["enable-automation"])
prefs = {"download.default_directory" : r'C:\Users\MyUser\Path\Directory\'}
options.add_experimental_option("prefs", prefs)
s = Service('chromeDriverPath/chromedriver.exe')
context.driver = webdriver.Chrome(service=s, options=options)