Selendroid作为网络抓取工具

时间:2015-05-05 16:41:45

标签: android selenium web-scraping selendroid

我打算创建一个Android应用程序,执行无头登录网站,然后从后续页面抓取一些内容,同时保持登录会话。

我首先在普通的Java项目中使用HtmlUnit,它运行得很好。但后来发现HtmlUnit与Android不兼容。

然后我通过向登录表单发送HTTP“POST”请求来尝试JSoup库。但由于JSoup不支持JavaScript,因此生成的页面不会完全加载。

然后建议我查看Selendroid实际上是一个android测试自动化框架。但我真正需要的是一个支持JavaScript和Android的Html解析器。我发现Selendroid很难理解,我甚至无法弄清楚要使用哪个dependencies

  • selendroid的客户端
  • selendroid-独立
  • selendroid服务器

使用Selenium WebDriver,代码将如下所示。但有人可以向我展示 Selendroid 的类似代码示例吗?

    WebDriver driver = new FirefoxDriver();
    driver.get("https://mail.google.com/");

    driver.findElement(By.id("email")).sendKeys(myEmail);
    driver.findElement(By.id("pass")).sendKeys(pass);

    // Click on 'Sign In' button
    driver.findElement(By.id("signIn")).click();

而且,

  1. 要添加到Gradle.Build文件的依赖项?
  2. 要导入哪些Selendroid库?

3 个答案:

答案 0 :(得分:1)

我从来没有使用过Selendroid所以我对此并不十分肯定,但是通过网络搜索我找到了这个example,据我所知,我认为你的代码翻译来自{{1} } Selenium将是:

翻译代码(在我看来)

Selendroid

您必须将哪些内容添加到项目中

您似乎必须在项目中添加public class MobileWebTest { private SelendroidLauncher selendroidServer = null; private WebDriver driver = null; @Test public void doTest() { driver.get("https://mail.google.com/"); WebElement email = driver.findElement(By.id("email")).sendKeys(myEmail); WebElement password = driver.findElement(By.id("pass")).sendKeys(pass); WebElement button = driver.findElement(By.id("signIn")).click(); driver.quit(); } @Before public void startSelendroidServer() throws Exception { if (selendroidServer != null) { selendroidServer.stopSelendroid(); } SelendroidConfiguration config = new SelendroidConfiguration(); selendroidServer = new SelendroidLauncher(config); selendroidServer.launchSelendroid(); DesiredCapabilities caps = SelendroidCapabilities.android(); driver = new SelendroidDriver(caps); } @After public void stopSelendroidServer() { if (driver != null) { driver.quit(); } if (selendroidServer != null) { selendroidServer.stopSelendroid(); } } } 。如果您对如何在Android项目中添加外部jar有疑问,可以看到以下问题:How can I use external JARs in an Android project?

您可以在此下载Selendroid standalone jar filejar file

此外,仅将jar file添加到项目中似乎还不够。您应该添加您拥有的独立版本的jar file

您可以从此处下载:client jar file

我希望它会对你有所帮助!

答案 1 :(得分:1)

不幸的是我没有让Selendroid工作。但我找到了一种解决方法来使用Android内置的WebView并启用JavaScript来抓取动态内容。

mWebView = new WebView();
mWebView.getSettings().setJavaScriptEnabled(true);
mWebView.addJavascriptInterface(new HtmlHandler(), "HtmlHandler");

mWebView.setWebViewClient(new WebViewClient() {
   @Override
   public void onPageFinished(WebView view, String url) {
       super.onPageFinished(view, url);

       if (url == urlToLoad) {
       // Pass html source to the HtmlHandler
       WebView.loadUrl("javascript:HtmlHandler.handleHtml(document.documentElement.outerHTML);");

   }
});

JS方法document.documentElement.outerHTML将检索加载的URL中包含的完整html。然后将重新获得的html字符串发送到HtmlHandler类中的handleHtml方法。

class HtmlHandler {
        @JavascriptInterface
        @SuppressWarnings("unused")
        public void handleHtml(String html) {
            // scrape the content here

        }
    }

您可以使用像Jsoup这样的库来从html字符串中删除必要的内容。

答案 2 :(得分:0)

我建议你使用WebdriverIO,因为你想使用Javascript。 它使用NodeJ,因此很容易需要其他插件来抓取HTML。

Appium也是一种替代方案,但它更专注于前端测试。