You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Crontab调度无法通过Selenium启动Safari问题求助

问题描述

手动运行Java代码(通过Selenium启动Safari)或在终端执行时一切正常,但通过crontab调度执行时失败,抛出如下错误。

启动Safari的代码

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;

public class SafariDemo {
    public static void main(String[] args) {
        WebDriver driver = new SafariDriver();
        driver.navigate().to("http://www.google.com/");
        driver.findElement(By.name("q")).click();
        driver.close();
    }
}

错误信息

ERROR: safaridriver could not launch because it is not configured
correctly or you need to authenticate. Re-run safaridriver(1) and
pass the '--enable' flag to configure and/or authenticate.
For more information, consult the safaridriver(1) man page.
Exception in thread "main" org.openqa.selenium.WebDriverException: java.net.ConnectException: Failed to connect to localhost/0:0:0:0:0:0:0:1:1709
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'GauravKumar-MAC.local', ip: 'fe80:0:0:0:809:261e:c8d9:42a1%en0', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.15.7', java.version: '1.8.0_382'
Driver info: driver.version: SafariDriver
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:92)
at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213)
at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:131)
at org.openqa.selenium.safari.SafariDriver.(SafariDriver.java:81)
at org.openqa.selenium.safari.SafariDriver.(SafariDriver.java:63)
at org.openqa.selenium.safari.SafariDriver.(SafariDriver.java:41)
at org.example.SafariDemo.main(SafariDemo.java:12)
Caused by: java.net.ConnectException: Failed to connect to localhost/0:0:0:0:0:0:0:1:1709
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:247)
at okhttp3.internal.connection.RealConnection.connect(RealConnection.java:165)
at okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257)
at okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135)
at okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114)
at okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147)
at okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121)
at okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200)
at okhttp3.RealCall.execute(RealCall.java:77)
at org.openqa.selenium.remote.internal.OkHttpClient.execute(OkHttpClient.java:103)
at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:105)
at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:74)
at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136)
at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
... 7 more
Caused by: java.net.ConnectException: Connection refused (Connection refused)
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350)
at java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206)
at java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392)
at java.net.Socket.connect(Socket.java:613)
at okhttp3.internal.platform.Platform.connectSocket(Platform.java:129)
at okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:245)


解决方案

crontab执行失败的核心原因是环境变量缺失和safaridriver权限验证问题,以下是具体修复步骤:

1. 完成safaridriver的授权配置

手动在终端执行safaridriver --enable,按照提示输入系统密码完成权限验证。这一步会初始化safaridriver的配置,确保后续运行时的权限正常。

2. 为crontab补充必要的环境变量

crontab的执行环境比用户终端少很多关键变量,需要手动添加:

  • 编辑crontab任务:crontab -e
  • 在任务行前添加环境变量配置示例:
    PATH=/usr/local/bin:/usr/bin:/bin:/usr/sbin:/sbin
    DISPLAY=:0
    
    PATH需包含Java、safaridriver的执行路径;DISPLAY指定GUI显示端口,保证Safari能正常启动。

3. 以当前用户身份执行crontab任务

safaridriver的授权是绑定到用户的,确保crontab是用当前运行代码的用户编辑的,而非root。如果必须用root执行,需切换到root环境重新运行safaridriver --enable完成授权。

4. 优化Java代码中的驱动配置(可选)

若上述步骤无效,可显式指定safaridriver路径并调整关闭逻辑:

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.safari.SafariDriver;
import org.openqa.selenium.safari.SafariOptions;

public class SafariDemo {
    public static void main(String[] args) {
        SafariOptions options = new SafariOptions();
        // 替换为你系统中safaridriver的绝对路径
        options.setCapability("safari.driver", "/usr/bin/safaridriver");
        WebDriver driver = new SafariDriver(options);
        driver.navigate().to("http://www.google.com/");
        driver.findElement(By.name("q")).click();
        driver.quit(); // 用quit()彻底关闭驱动,避免残留进程
    }
}

5. 验证crontab环境

编写简单测试脚本确认环境正常:

#!/bin/bash
echo "PATH: $PATH" >> /tmp/cron_safari_test.log
echo "DISPLAY: $DISPLAY" >> /tmp/cron_safari_test.log
safaridriver --version >> /tmp/cron_safari_test.log 2>&1

将脚本添加到crontab执行后,查看/tmp/cron_safari_test.log,确认safaridriver能正常调用。


内容的提问来源于stack exchange,提问作者gauravdot311

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.04 06:25:54