我打算创建一个Android应用程序,执行无头登录网站,然后从后续页面抓取一些内容,同时保持登录会话。
我首先在普通的Java项目中使用HtmlUnit,它运行得很好。但后来发现HtmlUnit与Android不兼容。
然后我通过向登录表单发送HTTP“POST”请求来尝试JSoup库。但由于JSoup不支持JavaScript,因此生成的页面不会完全加载。
然后建议我查看Selendroid实际上是一个android测试自动化框架。但我真正需要的是一个支持JavaScript和Android的Html解析器。我发现Selendroid很难理解,我甚至无法弄清楚要使用哪个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();
而且,
答案 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 file
:jar 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也是一种替代方案,但它更专注于前端测试。