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 以供使用。
- selendroid 客户端
- selendroid-独立
- selendroid-server
使用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();
还有,
- 要向我的 Gradle.Build 文件添加哪些依赖项?
- 要导入哪些 Selendroid 库?
我建议你使用 WebdriverIO,因为你想使用 Javascript。
它使用 NodeJs,因此很容易需要其他插件来抓取 HTML.
Appium 也是一个替代方案,但它更侧重于前端测试。
我从来没有用过 Selendroid
所以我不太确定但是通过网络搜索我发现了这个 example 并且根据它,我想你的代码翻译来自 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();
}
}
}
你有什么要添加到你的项目中
看来您必须将 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 字符串中抓取必要的内容。
我打算创建一个 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 以供使用。
- selendroid 客户端
- selendroid-独立
- selendroid-server
使用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();
还有,
- 要向我的 Gradle.Build 文件添加哪些依赖项?
- 要导入哪些 Selendroid 库?
我建议你使用 WebdriverIO,因为你想使用 Javascript。 它使用 NodeJs,因此很容易需要其他插件来抓取 HTML.
Appium 也是一个替代方案,但它更侧重于前端测试。
我从来没有用过 Selendroid
所以我不太确定但是通过网络搜索我发现了这个 example 并且根据它,我想你的代码翻译来自 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();
}
}
}
你有什么要添加到你的项目中
看来您必须将 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.
class HtmlHandler {
@JavascriptInterface
@SuppressWarnings("unused")
public void handleHtml(String html) {
// scrape the content here
}
}
您可以使用像 Jsoup 这样的库从 html 字符串中抓取必要的内容。