玩命加载中 . . .

安装和配置浏览器所需的driver


概述

之前开发的Web自动化只能在Windows下运行,且只支持Chrome浏览器(hard code),后期做了拓展,能够支持WindowsLinux平台下的多款浏览器,其中ChromeFirefox两个平台都支持,对于IEEdge只有Windows支持。

本文主要介绍一下如何在Linux下安装和配置浏览器和driver

Windows下安装比较简单,匹配对应浏览器版本的exe文件下载下来后放在浏览器所在路径即可。

安装&配置过程

Firefox的geckodriver安装

下载地址:

https://github.com/mozilla/geckodriver/releases

windows下下载后,解压放到Firefox安装路径即可。

Linux下下载后解压,放在Firefox安装路径下, 一般情况下,Firefox默认安装路径为/usr/bin

root@Gavin:/usr/bin# ls -l firefox
-rwxr-xr-x 1 root root 2377 Nov  6  2022 firefox
root@Gavin:/usr/bin# ls -l geckodriver
-rw-r--r-- 1 root root 10413536 Jun 11 15:36 geckodriver
root@Gavin:/usr/bin# chmod a+x geckodriver

直接将geckodriver放在此目录下,并增加可执行权限,此时通过selenium启动firefox提示:

解决方法:

Ubuntu端打开firefox浏览器(如使用xmanager),在浏览器中输入about:profiles,展示类似如下所示信息:

Local Director处内容复制出来,使用如下代码即可:

from selenium import webdriver
from selenium.webdriver.firefox.options import Options
options = Options()
options.add_argument("-profile")
options.add_argument("/root/snap/firefox/common/.cache/mozilla/firefox/shfysd7o.default")
br=webdriver.Firefox(options=options)
br.get("http://www.baidu.com/")

/root/snap/firefox/common/.cache/mozilla/firefox/shfysd7o.default 替换为你的Local Director处内容。

Linux下执行如上代码,确定能够正常启动Firefox browser

如果不想使用Local Director处的内容,可以点击Create a New Profile,新增一个profile(假如起名为selenium),并将新增的profile路径写入到上面调试代码中。

Chrome和chromedriver的安装

需要能够访问谷歌:

curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add 
curl -sS -o - https://dl-ssl.google.com/linux/linux_signing_key.pub | apt-key add 
bash -c "echo 'deb [arch=amd64] http://dl.google.com/linux/chrome/deb/ stable main' >> /etc/apt/sources.list.d/google-chrome.list" 
apt -y update
apt -y install google-chrome-stable 

成功安装后,展示信息如下:

root@Gavin:/etc/apt/sources.list.d# dpkg -l | grep -i chrome
ii  chromium-chromedriver                            1:85.0.4183.83-0ubuntu3                   amd64        Transitional package - chromium-chromedriver -> chromium snap
ii  google-chrome-stable                             125.0.6422.141-1                          amd64        The web browser from Google
ii  node-chrome-trace-event                          1.0.3-2                                   all          create a trace of your node app per Google's Trace Event format
root@Gavin:/etc/apt/sources.list.d# 

或者访问https://googlechromelabs.github.io/chrome-for-testing/进行下载,选择Stable版本,并将chromedriver移动到/usr/bin/目录下。

执行如下代码,检查Linux下启动Chrome是否OK:

from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.chrome.options import Options

service = Service(executable_path='/usr/bin/chromedriver')
options = Options()
options.add_argument("--no-sandbox")
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(service=service, options=options)
driver.get('https://www.baidu.com/')

其他

  • 由于没有Mac, 对于MocOS Safari的兼容,暂时不好处理;

  • Windows下自带的浏览器(IE, Edge),默认安装好Selenium后,天然支持,无需做任何安装处理。

参考链接

https://blog.csdn.net/baixvkwfn/article/details/123876636

https://blog.csdn.net/weixin_41446370/article/details/136636176

自动化项目中代码示例片段

class BasePage():
    # 图片文件夹路径
    report_path = get_report_path()
    img_path = report_path + os.sep + "screenshots"
    # # 如果目录不存在,创建它
    if not os.path.exists(report_path):
        os.mkdir(report_path, 0o777)
        os.mkdir(img_path, 0o777)
    if not os.path.exists(img_path):
        os.mkdir(img_path, 0o777)

    # Support Linux and Windoes OS
    os_platform = platform.platform()

    @classmethod
    def init_driver(cls, browser='chrome'):
        # 支持不同类型的浏览器
        if browser.lower() == 'chrome':
            if 'linux' in cls.os_platform.lower():
                from selenium.webdriver.chrome.service import Service
                from selenium.webdriver.chrome.options import Options
                service = Service(executable_path='/usr/bin/chromedriver')
                options = Options()
                options.add_argument("--no-sandbox")
                options.add_argument("--disable-gpu")
                options.add_argument("--window-size=1920,1080")
                cls.driver = webdriver.Chrome(service=service, options=options)
            else:
                cls.driver = webdriver.Chrome()
        elif browser.lower() == 'firefox':
            if 'linux' in cls.os_platform.lower():
                from selenium.webdriver.firefox.options import Options
                options = Options()
                options.add_argument("-profile")
                # The fallowing content of profile, should be replaced by your actually settigns which from firefox's 'default:settings'
                options.add_argument("/root/snap/firefox/common/.cache/mozilla/firefox/shfysd7o.default")
                cls.driver = webdriver.Firefox(options=options)
            else:
                cls.driver = webdriver.Firefox()
        elif browser.lower() == 'ie':
            if 'linux' in cls.os_platform.lower():
                print("\n[ERROR] Not support Linux OS for IE browser\n")
                sys.exit(1)
            cls.driver = webdriver.Ie()
        elif browser.lower() == 'edge':
            if 'linux' in cls.os_platform.lower():
                print("\n[ERROR] Not support Linux OS for Edge browser\n")
                sys.exit(1)
            cls.driver = webdriver.Edge()
        elif browser.lower() == 'safari':
            cls.driver = webdriver.Safari()
        else:
            raise ValueError(f"Unsupported browser: {browser}")

        # 最大化浏览器
        cls.driver.maximize_window()

        # 设置隐式等待时间
        timeout = 10
        cls.driver.implicitly_wait(timeout)

    @classmethod
    def quit_driver(cls):
        if cls.driver:
            cls.driver.quit()

文章作者: Gavin Wang
版权声明: 本博客所有文章除特別声明外,均采用 CC BY 4.0 许可协议。转载请注明来源 Gavin Wang !
  目录