Kotlin Selenium Chromedriver не существует - PullRequest
0 голосов
/ 20 марта 2019

Я пытаюсь создать веб-приложение с Kotlin. Поскольку веб-сайты, которые я буду копировать, сгенерированы JS, я пытался заставить Selenium работать, но я был озадачен этой ошибкой.

java.lang.RuntimeException: An error occurred while executing doInBackground()
        at android.os.AsyncTask$3.done(AsyncTask.java:353)
        at java.util.concurrent.FutureTask.finishCompletion(FutureTask.java:383)
        at java.util.concurrent.FutureTask.setException(FutureTask.java:252)
        at java.util.concurrent.FutureTask.run(FutureTask.java:271)
        at android.os.AsyncTask$SerialExecutor$1.run(AsyncTask.java:245)
        at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1162)
        at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:636)
        at java.lang.Thread.run(Thread.java:764)
     Caused by: java.lang.IllegalStateException: The driver executable does not exist: /home/nexus/Downloads/chromedriver

Я уже использовал 'chomd 777' с драйвером и пробовал его также с версией AUR.

Вот код из моей функции очистки

package com.example.nexus.scraper

import android.os.AsyncTask
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver

class Scrap(): AsyncTask<Void, Void, Void>() {
    override fun doInBackground(vararg params: Void?): Void? {
        System.setProperty("webdriver.chrome.driver","/home/nexus/Downloads/chromedriver")
        var driver: WebDriver = ChromeDriver()
        driver.get("www.google.com")
        return null
    }
}

А вот и мой build.gradle

apply plugin: 'com.android.application'

apply plugin: 'kotlin-android'

apply plugin: 'kotlin-android-extensions'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.example.nexus.scraper"
        minSdkVersion 15
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
        packagingOptions {
            exclude 'META-INF/DEPENDENCIES'
            exclude 'META-INF/LICENSE'
            exclude 'META-INF/LICENSE.txt'
            exclude 'META-INF/license.txt'
            exclude 'META-INF/NOTICE'
            exclude 'META-INF/NOTICE.txt'
            exclude 'META-INF/notice.txt'
            exclude 'META-INF/ASL2.0'
        }
    }
}

dependencies {
    implementation fileTree(dir: 'libs', include: ['*.jar'])
    implementation "org.jetbrains.kotlin:kotlin-stdlib-jdk8:$kotlin_version"    
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.1.3'
    implementation group: 'org.seleniumhq.selenium', name: 'selenium-java', version: '2.41.0'
    implementation 'com.android.support:support-annotations:27.1.1'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.2'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.2'
}

Спасибо!

Ответы [ 3 ]

0 голосов
/ 24 марта 2019

Ошибка была вызвана использованием Selenium, а не Selendrium

0 голосов
/ 04 июня 2019

я бы настоятельно рекомендовал использовать менеджер веб-драйверов вместо того, чтобы настраивать двоичные файлы браузера самостоятельно.

для установки нового драйвера Chrome, я бы поместил такую ​​функцию в мой код:

fun chrome(): WebDriver {
    WebDriverManager.chromedriver().setup()
    return ChromeDriver(chromeOptions())
}

теперь вы можете просто использовать эту функцию, которая будет возвращать ваш хром-драйвер, вот так:

val driver = chrome()
driver.get("www.google.com")

менеджер webdriver позаботится об автоматической установке двоичных файлов драйверов в зависимости от вашего текущегооперационная система.Для более сложного примера, который дает возможность динамически переключаться между различными настройками браузера или драйвера и полной настройкой селена, пожалуйста, посмотрите здесь

, потому что вы хотите очистить веб-сайт, я думаю,Chrome Headless Mode должен быть вашим выбором, потому что он более эффективен с точки зрения времени запуска браузера и т. д.

В общем, я бы рекомендовал использовать skrape {it} вместоселен, чтобы сделать работу (до тех пор, пока вам не нужно где-то нажимать).это библиотека, написанная на kotlin, которая была специально разработана для очистки веб-сайтов и поддерживает очистку веб-сайтов, отображаемых на JavaScript.Например, вы можете сделать что-то вроде этого, и все готово (не требуются дополнительные затраты селена):

val githubName = skrape {
    url = "https://github.com/skrapeit"
    mode = Mode.DOM
    extract {
        element(".h-card .p-nickname").text()
    }
}

это также будет работать с более сложными данными, например:

data class MyScrapedData(
    val userName: String, 
    val repositoryNames: List<String>
)

fun main() {
    val githubUserData = skrape {
        url = "https://github.com/skrapeit"
        mode = Mode.DOM

        extract {
            MyScrapedData(
                userName = element(".h-card .p-nickname").text(),
                repositoryNames = elements("span.repo").map { it.text() }
            )
        }
    }
    println("${githubUserData.userName}'s repos are ${githubUserData.repositoryNames}")
}

дляполный пример того, как очистить веб-сайт на языке javascript с помощью skrape {it}, смотрите в соответствующем разделе docs

0 голосов
/ 20 марта 2019

Вы должны применить каталог chromedriver в gradle.build:

 '--webdriver.chrome.driver=/home/nexus/Downloads/chromedriver'
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...