サーバ上でJava Seleniumのチュートリアルを実行


前言
前に国民的K歌に登场するSelemiunコードを书きますが、ローカルで走るしかないことに気づきました.サーバーに配置すると変なブラウザが见つからないエラーが発生します.それは役に立ちませんよね.その後、Hcbbt巨巨巨は私にチュートリアルを送ってくれたが、何かが少なくなったことに気づいた.今この完全な過程を書いて、みんなに役に立つことを望んでいます.
に頼る
新しいMavenプロジェクトはpomにあります.xmlにSeleniumとコンパイルパッケージの構成を加えます.完全なpom.xmlは以下の通りです.

<project xmlns="http://maven.apache.org/POM/4.0.0"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
    <modelVersion>4.0.0modelVersion>

    <groupId>com.zlxgroupId>
    <artifactId>selenium-exampleartifactId>
    <version>1.0-SNAPSHOTversion>

    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.seleniumgroupId>
            <artifactId>selenium-javaartifactId>
            <version>2.53.1version>
        dependency>
    dependencies>

    <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-compiler-pluginartifactId>
                <version>3.1version>
                <configuration>
                    <source>1.8source>
                    <target>1.8target>
                    <encoding>UTF8encoding>
                configuration>
            plugin>

            <plugin>
                <groupId>org.apache.maven.pluginsgroupId>
                <artifactId>maven-assembly-pluginartifactId>
                <version>2.5.5version>
                <configuration>
                    <archive>
                        <manifest>
                            <mainClass>SeleniumExamplemainClass>
                        manifest>
                    archive>
                    <descriptorRefs>
                        <descriptorRef>jar-with-dependenciesdescriptorRef>
                    descriptorRefs>
                configuration>
                <executions>
                    <execution>
                        <id>make-assemblyid>
                        <phase>packagephase>
                        <goals>
                            <goal>singlegoal>
                        goals>
                    execution>
                executions>
            plugin>
        plugins>
    build>
project>

そしてChromeを使っているのでChromeのWebDriverファイルを.ここへ降りてhttps://sites.google.com/a/chromium.org/chromedriver/
スタート
まず短くて最も簡単なコードを書いて、ローカルで走ることができるかどうかを見てみましょう.アカリンの図~コードを登ってみましょう.
そのlocalは私たちがローカルに保管しているchromedriverの位置です.
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.openqa.selenium.remote.DesiredCapabilities;

import java.util.List;

/**
 * Created by purefrog on 23/06/2017.
 */
public class SeleniumExample {
    public static String local = "/Users/purefrog/Downloads/chromedriver";

    public static void main(String[] args) throws Exception {
        System.setProperty("webdriver.chrome.driver", local);

        ChromeOptions options = new ChromeOptions();
        options.addArguments("window-size=1280,728");   //      

        DesiredCapabilities cap = DesiredCapabilities.chrome();
        cap.setCapability(ChromeOptions.CAPABILITY, options);
        WebDriver webDriver = new ChromeDriver(cap);

        String url = "https://image.baidu.com/search/index?tn=baiduimage&ipn=r&ct=201326592&cl=2&lm=-1&st=-1&fm=index&fr=&hs=0&xthttps=111111&sf=1&fmq=&pv=&ic=0&nc=1&z=&se=1&showtab=0&fb=0&width=&height=&face=0&istype=2&ie=utf-8&word=%E9%98%BF%E5%8D%A1%E6%9E%97&oq=%E9%98%BF%E5%8D%A1%E6%9E%97&rsp=-1";

        try {
            webDriver.get(url);
            Thread.sleep(10000);

            List webElements = webDriver.findElements(By.xpath("//img[@class='main_img img-hover']"));
            for (WebElement e : webElements) {
                System.out.println(e.getAttribute("src"));
            }
        } catch (Exception e) {
            e.printStackTrace();
        } finally {
            webDriver.close();
        }
    }
}

そしてUrlの塊が印刷されるはずです.説明はこれでいいです.
次に、デスクトップ環境のないサーバに配備してみます.さっきローカルのchromedriverの位置をサーバの位置に変更します.
配置mvn clean installちょっと.このときプロジェクトディレクトリのtarget下にselenium-example-1.0-SNAPSHOT-jar-with-dependencies.jarファイルが表示されます.
そしてこのファイルをサーバーに持って行きます.
サーバーはChromeをインストールします.まだ入っていなければこんなふうに着てもいいです.
wget https://dl.google.com/linux/direct/google-chrome-stable_current_amd64.deb
sudo apt install -f
dpkg -i google-chrome-stable_current_amd64.deb

そして前に私はここにいました.もしあなたが今直接java -jar xxx.jarで走っていたら、この間違いを報告するはずです!
Starting ChromeDriver 2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57) on port 14103
Only local connections are allowed.
Exception in thread "main" org.openqa.selenium.WebDriverException: unknown error: Chrome failed to start: exited abnormally
  (Driver info: chromedriver=2.30.477691 (6ee44a7247c639c0703f291d320bdf05c1531b57),platform=Linux 4.9.15-x86_64-linode81 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 60.13 seconds
Build info: version: 'unknown', revision: 'unknown', time: 'unknown'
System info: host: 'localhost', ip: '127.0.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.9.15-x86_64-linode81', java.version: '1.8.0_131'
Driver info: driver.version: ChromeDriver
    at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.lang.reflect.Constructor.newInstance(Constructor.java:423)
    at org.openqa.selenium.remote.ErrorHandler.createThrowable(ErrorHandler.java:215)
    at org.openqa.selenium.remote.ErrorHandler.throwIfResponseFailed(ErrorHandler.java:167)
    at org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$new$0(JsonWireProtocolResponse.java:53)
    at org.openqa.selenium.remote.JsonWireProtocolResponse.lambda$getResponseFunction$2(JsonWireProtocolResponse.java:91)
    at org.openqa.selenium.remote.ProtocolHandshake.lambda$createSession$22(ProtocolHandshake.java:365)
    at java.util.stream.ReferencePipeline$3$1.accept(ReferencePipeline.java:193)
    at java.util.Spliterators$ArraySpliterator.tryAdvance(Spliterators.java:958)
    at java.util.stream.ReferencePipeline.forEachWithCancel(ReferencePipeline.java:126)
    at java.util.stream.AbstractPipeline.copyIntoWithCancel(AbstractPipeline.java:498)
    at java.util.stream.AbstractPipeline.copyInto(AbstractPipeline.java:485)
    at java.util.stream.AbstractPipeline.wrapAndCopyInto(AbstractPipeline.java:471)
    at java.util.stream.FindOps$FindOp.evaluateSequential(FindOps.java:152)
    at java.util.stream.AbstractPipeline.evaluate(AbstractPipeline.java:234)
    at java.util.stream.ReferencePipeline.findFirst(ReferencePipeline.java:464)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:368)
    at org.openqa.selenium.remote.ProtocolHandshake.createSession(ProtocolHandshake.java:159)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:142)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:82)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:637)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:250)
    at org.openqa.selenium.remote.RemoteWebDriver.startSession(RemoteWebDriver.java:236)
    at org.openqa.selenium.remote.RemoteWebDriver.(RemoteWebDriver.java:137)
    at org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:184)
    at org.openqa.selenium.chrome.ChromeDriver.(ChromeDriver.java:148)
    at SeleniumExample.main(SeleniumExample.java:25)

これはXvfbというものがインストールされていないからです.
次にXvfbをインストールする:sudo apt install XvfbXvfbサービスを開始する:Xvfb -ac :7 -screen 0 1280x1024x8 &(これはxであり、*ではないことに注意してください)そしてもう一つ必要なもの:export DISPLAY=:7そして走れる!
ここではroot権限で走ってはいけません.そうしないとChrome not reachableのエラーが報告されます.java -jar selenium-example-1.0-SNAPSHOT-jar-with-dependencies.jar
そして出力が見えます.
以上です.