nonsensei
nonsensei

Reputation: 480

WebDriver on Android device

my goal is to be able to drive a browser on my Android device without javascript injections (so no webviews + js) and automate it (scraping, posting forms, changing page, clicking buttons etc.).

I'd rather not use JS because I'd like my automation to be completely "undetectable" from websites (captchas are a different story, not my current problem).

I thought to use the WebDriver API via Selendroid but all my efforts are failing. This is the code i wrote:

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();
    }
}

and this is my build.gradle file:

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')
}

this is the error:

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)

p.s. I already tried this solution Getting NoSuchFieldError INSTANCE org/apache/http/message/BasicHeaderValueParser

suggestions?

Thanks in advance

Upvotes: 2

Views: 229

Answers (0)

Related Questions