当前位置: 首页 > 知识库问答 >
问题:

Selendroid作为web刮刀

商兴朝
2023-03-14

我打算创建一个Android应用程序,它可以无头登录一个网站,然后在维护登录会话的同时从后续页面中删除一些内容。

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

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

然后有人建议我看看Selendroid,它实际上是一个android测试自动化框架。但我真正需要的是一个支持JavaScript和Android的Html解析器。我发现Selendroid很难理解,我甚至不知道应该使用哪些依赖项。

  • 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。构建文件?
  2. 要导入哪些Selendroid库?

共有3个答案

丁理
2023-03-14

我建议您使用WebDrivero,因为您想使用Javascript。它使用NodeJs,因此很容易需要其他插件来删除HTML。

Appium也是一种选择,但它更关注前端测试。

花品
2023-03-14

我从来没有使用过Selendroid,所以我不太确定,但通过网络搜索我找到了这个例子,根据它,我认为您从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独立jar文件添加到您的项目中。如果你对如何在Android项目中添加外部JAR有疑问,你可以看到这个问题:如何在Android项目中使用外部JAR?

您可以在这里下载jar文件:jar文件

此外,似乎仅仅将jar文件添加到项目中是不够的。您也应该添加您所拥有的独立版本的selendroid-Client jar文件

您可以从这里下载:clientjar文件

期待对你有所帮助!

何灼光
2023-03-14

不幸的是,我没有让Selendroid工作。但是我找到了一个变通方法,通过使用Android内置的启用JavaScript的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.outer超文本标记语言将检索加载的url中包含的完整html。然后将检索的html字符串发送到HtmlHandler类中的handleHtml方法。

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

        }
    }

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

 类似资料:
  • Selendroid 是一个 Android 原生应用的 UI 自动化测试框架。测试使用 Selenium 2 客户端 API 编写。 Selendroid 可在仿真器和真实设备上运行,可集成 Node.js 到 Selenium Grid 实现伸缩性和并行测试。 示例代码: driver = new AndroidDriver(new URL("http://localhost:8080/wd/

  • 我对python有点陌生,但我正在尝试制作一个web scraper脚本,它可以在网站上下载所有图片。我正在使用requests和PyQuery,因为许多人在做了一些研究后推荐了它。这就是我现在所拥有的,我不知道该去哪里。 我知道我需要获取img的来源,但在找到img标签后如何做到这一点?此外,我查看了一些htmls的页面源,一些图片存储在他们的数据库中,因此src以“/”开头一些扩展“所以我想知

  • 实现一个刮刮乐的刮奖效果。即用手指滑动刮奖区,会刮去上面一层视图,显示下面一层视图的内容。 [Code4App.com]

  • 问题内容: Golang网络抓取工具需要从经过NTLM认证的网页中提取信息。 拥有有效的用户名和密码后,网络抓取工具如何与服务器执行NTLM 4向握手,以获取对后面受保护网页的访问权限? 问题答案: 您可以在开始抓取之前使用类似身份验证的包。

  • 我正在从一个站点上刮取数据,每个项目都有一个相关的文档URL。我想从那个文件中刮数据,这是可用的HTML格式后点击链接。现在,我一直在使用Google Sheets导入feed来填充基本列。 有没有下一步,我可以做的,进入每个相应的URL并从文档中抓取元素,并用它们填充Google表单?我之所以使用RSS提要(而不是python和BS)是因为它们实际上提供了一个RSS提要。 我找过了,没有找到一个