Selendroid 作为网络抓取工具

Selendroid as a web scraper

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

我第一次在一个普通的 Java 项目中使用 HtmlUnit,它工作得很好。但是后来发现HtmlUnit不兼容Android。

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

然后有人建议我看看 Selendroid which actually is an android test automation framework. But what I actually need is an Html parser that supports both JavaScript and Android. I find Selendroid quite difficult to understand which I can't even figure out which dependencies 以供使用。

使用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 库?

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

Appium 也是一个替代方案,但它更侧重于前端测试。

我从来没有用过 Selendroid 所以我不太确定但是通过网络搜索我发现了这个 example 并且根据它,我想你的代码翻译来自 SeleniumSelendroid 将是:

翻译代码(个人认为)

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

你有什么要添加到你的项目中

看来您必须将 Selendroid standalone jar file 添加到您的项目中。如果您对如何在 Android 项目中添加外部 jar 有疑问,您可以看到这个问题:How can I use external JARs in an Android project?

在这里你可以下载 jar file: jar file

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

您可以从这里下载:client jar file

希望对您有所帮助!

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

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 class.

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

        }
    }

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