2015-05-05 3 views
13

Я намереваюсь создать приложение для Android, которое запускает безгласный вход на веб-сайт, а затем очищает содержимое с последующей страницы при сохранении сеанса входа в систему.Selendroid как веб-скребок

Вначале я использовал HtmlUnit в обычном проекте Java, и он работал отлично. Но позже выяснилось, что HtmlUnit несовместим с Android.

Затем я попробовал библиотеку JSoup, отправив запрос HTTP «POST» в форму для входа. Но итоговая страница не загружается полностью, так как JSoup не поддерживает JavaScript.

Мне было предложено взглянуть на Selendroid, который на самом деле является платформой автоматизации тестирования Android. Но мне действительно нужен парсер Html, который поддерживает как JavaScript, так и Android. Я считаю, что 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 для импорта?

ответ

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 будет получать полный HTML, содержащийся в загруженном URL. Затем возвращаемая строка html отправляется методу handleHtml в классе HtmlHandler.

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

     } 
    } 

Вы можете использовать библиотеку Jsoup, чтобы очистить необходимый контент от строки html.

+0

Это решение работает, но когда я пытаюсь реализовать его на веб-сайте с несколькими переадресациями, он терпит неудачу, хотя я сравниваю URL-адреса, перенаправления берут страницу на один и тот же URL-адрес, я использовал счетчики, но, похоже, не знаю, когда именно страница полностью загружена. –

0

Я предлагаю вам использовать WebdriverIO, так как вы хотите использовать Javascript. Он использует NodeJs, поэтому будет легко потребовать, чтобы другие плагины очищали HTML.

Appium также является альтернативой, но он больше ориентирован на тестирование на переднем конце.

+0

Вы уверены, что WebdriverIO может использоваться с веб-сайтом для андроидов – Markoe7

+0

WebDriverIO может работать с Android точно – Homewrecker

1

Я никогда не использовал 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 проекте вы можете увидеть этот вопрос: How can I use external JARs in an Android project?

Здесь вы можете скачать jar file: jar file

Кроме того, кажется, что это не достаточно просто добавить jar file к вашему проекту.Вы также должны добавить selendroid-client jar file версии автономной версии, которая у вас есть.

Вы можете скачать его здесь: client jar file

Я ожидаю, что это будет полезно для вас!

+0

Нужно ли начинать/останавливать сервер Selendroid, чтобы использовать драйвер? – Markoe7

+0

Как я уже сказал в своем ответе, я ** никогда не использовал 'Selendroid', я просто собираю всю информацию и собираюсь в ответ, поэтому я не могу подтвердить, что я говорю, что это правда, но похоже, что это необходимо, поскольку на официальной странице написано: «Запустите сервер selendroid-standalone». Здесь у вас есть источник, где я видел это с видео DEMO: http://selendroid.io/mobileWeb.html –

+0

это, кажется, бросает ошибку: Ошибка: выполнение выполнено для задачи ': app: preDexDebug'. > com.android.ide.common.process.ProcessException: org.gradle.process.internal.ExecException: Process 'command' /Library/Java/JavaVirtualMachines/jdk1.8.0_25.jdk/Contents/Home/bin/java ' 'закончил с ненулевым значением выхода 134 – Markoe7