centos安装chrome浏览器及chromeDriver驱动

703 阅读3分钟

发布时间: 2024-06-29

  • 业务场景:

需要 java 的 selenium控制浏览器测试爬取网页内容

  • 环境依赖:

chrome版本 google-chrome-stable_deb_rpm_80.0.3987.87

chromeDriver版本 ChromeDriver 80.0.3987.16

java的selenium的maven依赖版本

<groupId>org.seleniumhq.selenium</groupId>
<artifactId>selenium-java</artifactId>
<version>3.141.59</version>
  • 系统环境:centos7.9

先说结论,首先得下载你服务器能安装的chrome版本,从低版本安装,能成功就行,最新版本126要求glibc2.25,这个东西千万别随便升级,很容易系统崩溃!!! 其次chromeDriver的驱动版本需要与chrome一致,小版本号不一致好像也可以,尽量是一样的

chrome各版本下载链接:Google Chrome 64bit Linux版_chrome浏览器,chrome插件,谷歌浏览器下载,谈笑有鸿儒 (chromedownloads.net)

chromeDriver各版本下载链接:CNPM Binaries Mirror (npmmirror.com)

截止目前,谷歌浏览器的最新版本是126,但不要去追求最新版,因为centos7已经停止更新,新版本来就不适配。如果是ubuntu,建议直接用playwright,他会自己下驱动,不用搞这么麻烦

这里也放一个最新版本的驱动,以及安装包的下载链接:用于测试的Chrome可用性 --- Chrome for Testing availability (googlechromelabs.github.io) 下面是实际安装过程

1、下载chrome版本,放到服务器的文件目录

2、在对应目录下,使用yum安装

yum localinstall google-chrome-stable_deb_rpm_80.0.3987.87

安装完成后,可以使用google-chrome --version查看是否安装完成,以及版本号

3、下载chromeDriver,建议直接放到java的启动目录,这样找起来方便

System.setProperty("webdriver.chrome.driver", "绝对路径/chromeDriver")

这个代码是写在java里面的,需要设置驱动路径

4、此时已经安装完成,java里面添加maven依赖 刷新一下即可,下面就是java的代码了

WebDriver driver = null;
        try {
            ChromeOptions chromeOptions = new ChromeOptions();
            //无头启动,即不打开浏览器窗口,服务器必须设置这个
            chromeOptions.setHeadless(true);
            //用于解决root账户启动的java程序,导致chrome启动会报沙盒错误
            chromeOptions.addArguments("--no-sandbox");
            driver = new ChromeDriver(chromeOptions);
            //导航到指定页面
            driver.get("http://www.baidu.com");
            //querySelector选择器,不用多说
            WebElement param = driver.findElement(By.cssSelector("#param"));
            //设置input的value值
            param.sendKeys("114514");
            WebElement button = driver.findElement(By.cssSelector("#__next > div > button"));
            button.click();
            WebElement result = driver.findElement(By.cssSelector("#result"));
            String msg = "";
            int maxTime = 15000;
            int oneTime = 100;
            int i = 0;
            //button执行方法是不会阻塞到完成的,所以这里需要循环获取数据,直到赋值成功才能拿到数据
            while (StringUtils.isBlank(msg)) {
                try {
                    if (i >= maxTime) break;
                    //等同input.value 
                    msg = result.getAttribute("value");
                    i += oneTime;
                    Thread.sleep(oneTime);
                } catch (Exception e) {
                    log.error("msg getAttribute error:{}", e.getMessage(), e);
                }
            }
            return msg;
        } finally {
            if (driver != null) {
                driver.quit();
            }
        }

上面最需要注意的是,最后执行的是driver.quit(),而不是driver.close(), close是没有效果的,无法正确关闭驱动

这个设置需要单独说一下, 这个是关闭浏览器的沙盒模式,可能会有安全风险, 但如果你的java应用是使用root账号启动的,就必须有这个设置,因为不允许root账户开启沙盒模式. 如果需要设置非root用户启动, 需要保证你的java应用的启动用户必须也有chrome的启动权限,这样才能成功运行

chromeOptions.addArguments("--no-sandbox");

最后咱们springboy的一点配置小技巧,这样就不用改代码来控制chromeDriver的文件路径问题了

    @Value("${chromeDriverPath}")
    private String chromeDriverPath;
​
    @PostConstruct
    public void init() {
        System.setProperty("webdriver.chrome.driver", chromeDriverPath);
    }