问答 求问怎么解决 Mac+Jenkins 中 selenium 启动 chromedriver 未显示浏览器的问题

xiaoxiao · 2020年06月14日 · 最后由 醋精测试媛 回复于 2021年02月23日 · 249 次阅读

本地执行脚本没问题,能正常打开浏览器,并通过点击对应的控件元素,但是集成到 Jenkins 之后,在 Jenkins 执行时,因为浏览器未打开显示出来,导致后续的点击元素失败。请问人遇到这样的情况么?是需要在 Jenkins 中配置什么环境么?

脚本如下

import os
import requests
import json
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
import selenium.webdriver.support.expected_conditions as EC


# 打开网络,登录,获取driver
def get_driver(url):
    options = webdriver.ChromeOptions()
    options.add_argument('--no-sandbox')
    options.add_argument('--disable-gpu')
    options.add_argument('--hide-scrollbars')
    # options.add_argument('--headless')
    options.add_experimental_option('excludeSwitches', ['enable-automation'])
     # 浏览器不提供可视化页面. linux下如果系统不支持可视化不加这条会启动失败
    # 设置权限
    prefs = {"profile.managed_default_content_settings.images": 1}
    #options.add_experimental_option("prefs", prefs)
    current_dir = os.path.dirname(os.path.abspath(__file__))
    print("current_dir: " + current_dir)
    chromedriver_dir = current_dir+'/chromedriver'
    print("chromedriver_dir: " + chromedriver_dir)
    driver = webdriver.Chrome(options=options, executable_path=chromedriver_dir)
    driver.get(url)
    # print(driver.page_source)
    driver.find_element_by_id('kw').send_keys('testerhome')
    driver.find_element_by_id('su').click()
    print("Click success")
    return driver


# 获取cookies信息
def get_cookies(driver):
    cookies = driver.get_cookies()
    Cookies = ''
    for lt in cookies:
        Cookies = Cookies + lt['name'] + '=' + lt['value'] + ';'
    print('Cookies:' + str(Cookies))
    driver.quit()
    return Cookies


driver = get_driver("http://www.baidu.com")
cookies = get_cookies(driver)

1、本地执行结果

$ python3 test.py
current_dir: /Users/aaa/JenkinProjects
chromedriver_dir: /Users/aaa/JenkinProjects/chromedriver
Click success
Cookies:WWW_ST=1592104224283;BDSVRTM=15;PSINO=6;BD_CK_SAM=1;H_PS_PSSID=31909_14350_3136_2045_31714_30823_31846;BAIDUID=5945D257E9532E230820BDC4626B9B:FG=1;delPer=0;BIDUPSID=5945D257E5952ECC8F24B6FC2FE77EC;PSTM=159210441;BD_UPN=123253;BD_HOME=1;

2、Jenkins 执行结果

Running as SYSTEM
Building in workspace /Users/Shared/Jenkins/Home/workspace/test
[test] $ /bin/sh -xe /Users/Shared/Jenkins/tmp/jenkins5191306205202886733.sh
+ /usr/local/Cellar/python/3.7.0/bin/python3 /Users/aaa/JenkinProjects/test.py
current_dir: /Users/aaa/JenkinProjects
chromedriver_dir: /Users/aaa/JenkinProjects/chromedriver
Traceback (most recent call last):
  File "/Users/aaa/JenkinProjects/test.py", line 71, in <module>
    driver = get_driver("http://www.baidu.com")
  File "/Users/aaa/JenkinProjects/test.py", line 55, in get_driver
    driver.find_element_by_id('su').click()
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 80, in click
    self._execute(Command.CLICK_ELEMENT)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webelement.py", line 633, in _execute
    return self._parent.execute(command, params)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "/usr/local/lib/python3.7/site-packages/selenium/webdriver/remote/errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.ElementNotVisibleException: Message: element not interactable
  (Session info: chrome=83.0.4103.97)
  (Driver info: chromedriver=70.0.3538.16 (16ed95b41bb05e565b11fb66ac33c660b721f778),platform=Mac OS X 10.14.5 x86_64)

Build step 'Execute shell' marked build as failure
Finished: FAILURE
共收到 17 条回复 时间 点赞

使用无头模式时需要设置初始化窗口大小
add_argument("--window-size=1920,1080")
如果不定义初始窗口大小的话,有些元素会因为无头模式运行的浏览器窗口太小而定位不到。

options = Options()
# 此步骤很重要,设置为开发者模式,防止被各大网站识别出来使用了Selenium
# options.add_experimental_option('excludeSwitches', ['enable-logging']) #禁止打印日志
options.add_experimental_option('excludeSwitches', ['enable-automation'])  # 跟上面只能选一个
options.add_argument('--incognito')  # 无痕隐身模式
options.add_argument("disable-cache")  # 禁用缓存
options.add_argument('disable-infobars')  # 禁用“chrome正受到自动测试软件的控制”提示
options.add_argument('log-level=3')  # INFO = 0 WARNING = 1 LOG_ERROR = 2 LOG_FATAL = 3 default is 0
options.add_argument("--headless")  # 无头模式--静默运行
options.add_argument("--window-size=1920,1080")  # 使用无头模式,需设置初始窗口大小
options.add_argument("--test-type")
options.add_argument("--ignore-certificate-errors")  # 与上面一条合并使用;忽略 Chrome 浏览器证书错误报警提示
options.add_argument("--disable-gpu")  # 禁用GPU加速
options.add_argument("--no-first-run")  # 不打开首页
options.add_argument("--no-default-browser-check")  # 不检查默认浏览器
options.add_argument('--start-maximized')  # 最大化

driver = webdriver.Chrome(executable_path=driver_path, chrome_options=options)

看报错,最后也是元素定位不到,我想一楼的说法估计有效,哈哈哈

周杰偷 回复

我的脚本用本地命令行跑是正常的,也能看到打开了浏览器,窗口也足够大。就是用 Jenkins 跑的时候,看不到有浏览器有打开,所以导致找不到元素就报错了。试用了一楼的代码依然是无效。我怀疑是 Jenkins 需要配置什么才能通过 chromedriver 调起 Chrome 浏览器

刘旭 回复

试了,Jenkins 执行还是无效😂

周杰偷 回复

大佬可以用 Jenkins 帮忙试试看?我的 demo 脚本也比较简单,然后我的 Execute Shell 配置的是/usr/local/Cellar/python/3.7.0/bin/python3 /Users/aaa/JenkinProjects/test.py😆 拜谢~

xiaoxiao 回复

不是啥大佬😂 我用 jenkins 构建成功了

其实 element not interactable 也不是找不到元素,而是元素不可见。一般没有最大化窗口会遇到
你把

options.add_argument('--start-maximized')

加上试试

之前也在论坛问过相同的问题,不过没有解决,询问公司前辈给的方案。我之前在公司写自动化 ui 的时候也遇到了相同的问题,因为是在 jenkins 上跑,Jenkins 如果作为 window 服务会隐藏浏览器,最后解决时通过 jenkins 调用本地设置的定时任务实现希望可以帮助你。

周杰偷 回复

试过了,也不行,估计是因为我的是 Mac,打算放弃 Jenkins 了,改用 crontab 定时器进行处理,也能满足我的需求😂

austim 回复

我是 Mac,放弃 Jenkins 了,改用 crontab 定时器搞了,网上也没有搜到解决方案😖 😔

xiaoxiao 回复

再一个

(Session info: chrome=83.0.4103.97)
(Driver info: chromedriver=70.0.3538.16 (16ed95b41bb05e565b11fb66ac33c660b721f778),platform=Mac OS X 10.14.5 x86_64)

你这 chromedriver 和 chrome 版本也不匹配啊。你要不要去换个 chromedriver 试试啊。

我来解决,这个坑 我刚踩完

windwos 是这样解决的

echo "Jenkins CI automation testting"
java -jar "C:Program Files (x86) Jenkinsjenkins.war" --httpPort=8080
pause

jiawei.li 回复

请问第三个 pause 是什么意思呢?

xiaoxiao 回复

不显示的原因:

因 jenkins 是用 windows install 安装成 windows 的服务,那么 jenkins 是一个后台服务,所以跑 webdriver 的时候是看不到浏览器的动作。

解决方法一:

(1),windows 的控制面板 -- 管理工具 -- 服务。找到 jenkins 服务,先停用,然后修改启动类型为禁用。

(2),手动启动 jenkins.war。定位到 jenkins.war 文件所在的文件夹。执行 java -jar jenkins.war。

(3),重新进 jenkins,创建 job,然后构建执行就 OK。  (需要重新安装插件。)

解决方法二:

可以做成一个 bat 文件,以后每次启动 jenkins,双击运行这个 bat 文件就可以了

语句如下:

echo "Jenkins CI automation testting"
java -jar "C:\Program Files (x86)\Jenkins\jenkins.war"
pause

jiawei.li 回复

我的是 Mac,目前还没解决


Mac+Jenkins 执行成功

太厉害了,解决了 MacOS selenium 无头浏览无响应的问题😬

无头模式下好像拖拽不成功,这种情况怎么办?

需要 登录 后方可回复, 如果你还没有账号请点击这里 注册