WebDriver на устройстве Android

Моя цель состоит в том, чтобы иметь возможность управлять браузером на моем устройстве Android без инъекций javascript (поэтому нет webviews + js) и автоматизировать его (очистка, размещение форм, изменение страницы, нажатие кнопок и т. д.).

Я бы предпочел не использовать JS, потому что я хотел бы, чтобы моя автоматизация была полностью "необнаружимой" с веб-сайтов (капчи - это отдельная история, а не моя текущая проблема).

Я думал использовать API WebDriver через Selendroid, но все мои усилия терпят неудачу. Это код, который я написал:

public class MainActivity extends AppCompatActivity {
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        SelendroidCapabilities caps = SelendroidCapabilities.empty();
        caps.setJavascriptEnabled(true);
        caps.setAut("com.myapp.myapp");
        caps.setLaunchActivity("com.myapp.myapp.WebViewActivity"); // activity containing a webview only

        WebDriver driver = null;
        try {
            driver = new SelendroidDriver(caps); // !! it fails here !!
        } catch (Exception e) {
            e.printStackTrace();
            return;
        }
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);

        driver.get("https://www.example.com");

        WebElement inputField = driver.findElement(By.id("my_text_field"));
        inputField.sendKeys("Selendroid");
        driver.quit();
    }
}

и это мой файл build.gradle:

apply plugin: 'com.android.application'

android {
    compileSdkVersion 26
    defaultConfig {
        applicationId "com.myapp.myapp"
        minSdkVersion 23
        targetSdkVersion 26
        versionCode 1
        versionName "1.0"
        testInstrumentationRunner "android.support.test.runner.AndroidJUnitRunner"
        multiDexEnabled true
    }
    buildTypes {
        release {
            minifyEnabled false
            proguardFiles getDefaultProguardFile('proguard-android.txt'), 'proguard-rules.pro'
        }
    }

    packagingOptions {
        exclude 'META-INF/DEPENDENCIES'
        exclude 'README.md'
    }
}

dependencies {
    implementation fileTree(include: ['*.jar'], dir: 'libs')
    implementation 'com.android.support:appcompat-v7:26.1.0'
    implementation 'com.android.support.constraint:constraint-layout:1.0.2'
    testImplementation 'junit:junit:4.12'
    androidTestImplementation 'com.android.support.test:runner:1.0.1'
    androidTestImplementation 'com.android.support.test.espresso:espresso-core:3.0.1'

    compile files('libs/selendroid-client-0.17.0.jar')
    compile files('libs/selendroid-standalone-0.17.0-with-dependencies.jar')
}

это ошибка:

Process: com.myapp.myapp, PID: 25868
java.lang.NoSuchFieldError: No static field INSTANCE of type Lorg/apache/http/message/BasicLineFormatter; in class Lorg/apache/http/message/BasicLineFormatter; or its superclasses (declaration of 'org.apache.http.message.BasicLineFormatter' appears in /system/framework/org.apache.http.legacy.boot.jar)
   at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:52)
   at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<init>(DefaultHttpRequestWriterFactory.java:56)
   at org.apache.http.impl.io.DefaultHttpRequestWriterFactory.<clinit>(DefaultHttpRequestWriterFactory.java:46)
   at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:72)
   at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<init>(ManagedHttpClientConnectionFactory.java:84)
   at org.apache.http.impl.conn.ManagedHttpClientConnectionFactory.<clinit>(ManagedHttpClientConnectionFactory.java:59)
   at org.apache.http.impl.conn.PoolingHttpClientConnectionManager$InternalConnectionFactory.<init>(PoolingHttpClientConnectionManager.java:493)
   at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:149)
   at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:138)
   at org.apache.http.impl.conn.PoolingHttpClientConnectionManager.<init>(PoolingHttpClientConnectionManager.java:114)
   at org.openqa.selenium.remote.internal.HttpClientFactory.getClientConnectionManager(HttpClientFactory.java:74)
   at org.openqa.selenium.remote.internal.HttpClientFactory.<init>(HttpClientFactory.java:57)
   at org.openqa.selenium.remote.internal.HttpClientFactory.<init>(HttpClientFactory.java:60)
   at org.openqa.selenium.remote.internal.ApacheHttpClient$Factory.getDefaultHttpClientFactory(ApacheHttpClient.java:251)
   at org.openqa.selenium.remote.internal.ApacheHttpClient$Factory.<init>(ApacheHttpClient.java:228)
   at org.openqa.selenium.remote.HttpCommandExecutor.getDefaultClientFactory(HttpCommandExecutor.java:96)
   at org.openqa.selenium.remote.HttpCommandExecutor.<init>(HttpCommandExecutor.java:70)
   at io.selendroid.client.SelendroidCommandExecutor.<init>(SelendroidCommandExecutor.java:77)
   at io.selendroid.client.SelendroidDriver.<init>(SelendroidDriver.java:84)
   at com.myapp.myapp.MainActivity$1.run(MainActivity.java:45)

PS Я уже пробовал это решение Получение NoSuchFieldError INSTANCE org/apache/http/message/BasicHeaderValueParser

предложения?

заранее спасибо

0 ответов

Другие вопросы по тегам