我正在尝试使用 selenium 打开 safari 浏览器,还使用 crontab 来安排它。 当我通过代码或终端手动运行代码时,它工作正常,但是当我使用 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();
}
}
错误:
错误:safaridriver 无法启动,因为未配置 正确,否则您需要进行身份验证。重新运行 safaridriver(1) 并 传递“--enable”标志来配置和/或身份验证。 有关更多信息,请参阅 safaridriver(1) 手册页。 线程“main”中的异常 org.openqa.selenium.WebDriverException:java.net.ConnectException:无法连接到 localhost/0:0:0:0:0:0:0:1:1709 构建信息:版本:'3.141.59',修订版:'e82be7d358',时间:'2018-11-14T08:17:03' 系统信息:主机:'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.version:SafariDriver 在 org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:92) 在 org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552) 在 org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:213) 在 org.openqa.selenium.remote.RemoteWebDriver。(RemoteWebDriver.java:131) 在 org.openqa.selenium.safari.SafariDriver。(SafariDriver.java:81) 在 org.openqa.selenium.safari.SafariDriver。(SafariDriver.java:63) 在 org.openqa.selenium.safari.SafariDriver。(SafariDriver.java:41) 在 org.example.SafariDemo.main(SafariDemo.java:12) 引起原因:java.net.ConnectException:无法连接到 localhost/0:0:0:0:0:0:0:1:1709 在 okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:247) 在 okhttp3.internal.connection.RealConnection.connect(RealConnection.java:165) 在 okhttp3.internal.connection.StreamAllocation.findConnection(StreamAllocation.java:257) 在 okhttp3.internal.connection.StreamAllocation.findHealthyConnection(StreamAllocation.java:135) 在 okhttp3.internal.connection.StreamAllocation.newStream(StreamAllocation.java:114) 在 okhttp3.internal.connection.ConnectInterceptor.intercept(ConnectInterceptor.java:42) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) 在 okhttp3.internal.cache.CacheInterceptor.intercept(CacheInterceptor.java:93) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) 在 okhttp3.internal.http.BridgeInterceptor.intercept(BridgeInterceptor.java:93) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) atokhttp3.internal.http.RetryAndFollowUpInterceptor.intercept(RetryAndFollowUpInterceptor.java:126) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:147) 在 okhttp3.internal.http.RealInterceptorChain.proceed(RealInterceptorChain.java:121) 在 okhttp3.RealCall.getResponseWithInterceptorChain(RealCall.java:200) 在 okhttp3.RealCall.execute(RealCall.java:77) 在 org.openqa.selenium.remote.internal.OkHttpClient.execute(OkHttpClient.java:103) 在 org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:105) 在 org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:74) 在 org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:136) 在 org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83) ... 7 更多 引起原因:java.net.ConnectException:连接被拒绝(连接被拒绝) 在 java.net.PlainSocketImpl.socketConnect(本机方法) 在 java.net.AbstractPlainSocketImpl.doConnect(AbstractPlainSocketImpl.java:350) 在 java.net.AbstractPlainSocketImpl.connectToAddress(AbstractPlainSocketImpl.java:206) 在 java.net.AbstractPlainSocketImpl.connect(AbstractPlainSocketImpl.java:188) 在 java.net.SocksSocketImpl.connect(SocksSocketImpl.java:392) 在 java.net.Socket.connect(Socket.java:613) 在 okhttp3.internal.platform.Platform.connectSocket(Platform.java:129) 在 okhttp3.internal.connection.RealConnection.connectSocket(RealConnection.java:245)
Safari 没有无头模式,并且 cron 通常无法访问显示器,因此您将很难让浏览器或 safari 驱动程序以这种方式启动。
我通过使用用户登录时运行的 LaunchAgent 来解决这个问题 - 对于这些东西有一个 简单的备忘单 ,但只需创建一个简单的 plist 文件来运行你的脚本,例如将运行的这个每五分钟一次:
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE plist PUBLIC "-//Apple Computer//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd">
<plist version="1.0">
<dict>
<key>Label</key>
<string>com.somedomain.your-script-name.plist</string>
<key>KeepAlive</key>
<false/>
<key>ProgramArguments</key>
<array>
<string>/path/to/your/script.sh</string>
</array>
<key>StartInterval</key>
<integer>300</integer>
</dict>
</plist>
假设它保存在
~/Library/LaunchAgents/com.somedomain.your-script-name.plist
,然后通过运行id
命令找到你的uid,然后运行:
cd ~/Library/LaunchAgents
launchctl bootstrap gui/<uid> com.somedomain.your-script-name.plist
launchctl enable gui/<uid>/com.somedomain.your-script-name.plist