Возникли трудности с поиском элементов с использованием Xpath и CSS в тестировании Selenium Android Webdriver

Я хочу автоматизировать приложения для Android с помощью Selenium WebDriver, и я запустил простую программу, чтобы открыть страницу Google и выполнить поиск по термину. При поиске элемента с именем и идентификатором он работает отлично. Но при попытке найти элемент с помощью Xpath и Css кажется трудным. Кто-нибудь знает, как использовать пути xpath и css в Selen android WebDriver? Вот пример кода, который я использовал:

public class TestDriver extends TestCase 
{

    public static void testGoogle() throws Exception 
    {
    AndroidDriver driver = new AndroidDriver();


    driver.get("http://google.com");
    WebElement element = driver.findElement(By.name("q"));
       //WebElement element = driver.findElement(By.xpath("//*[@id='gbqfq']"));
       //WebElement element = driver.findElement(By.cssSelector("#gbqfq"));
    element.sendKeys("android driver");
    element.submit();
    System.out.println("Page title is: " + driver.getTitle());
    //driver.quit();
  }

}

2 ответа

Решение

Мне удалось доказать это By.xpath а также By.cssSelector способны находить элементы, которые затем могут использоваться в нашем коде для взаимодействия с веб-страницей. По нескольким практическим причинам я создал теневую упрощенную тестовую страницу, которая затем отправляет запрос для получения результатов поиска из поисковой системы Google.

Вот упрощенная тестовая страница, достаточная для демонстрации основ. Скопируйте этот файл на SD-карту вашего устройства Android или AVD, например, с помощью следующей команды adb push form.html /sdcard/form.html

<html>
<head>
  <title>WebDriver form test page</title>
</head>
<body>
<form name="testform" action="http://www.google.co.uk/search" method="get">
  <input id="gbqfq" class="gbqfif" type="text" value="" autocomplete="off" name="q">
  <input type="submit" value="search Google">
</form>
</body>
</html>

А вот модифицированная версия кода в вашем вопросе:

@Test
public void testByClauses() throws Exception {
     AndroidDriver driver = new AndroidDriver();
     // driver.get("http://www.google.co.uk/");
     driver.get("file:///sdcard/form.html");
     System.out.println(driver.getPageSource());

     WebElement nameElement = driver.findElement(By.name("q"));
     WebElement xpathElement = driver.findElement(By.xpath("//*[@id='gbqfq']"));
     WebElement cssElement = driver.findElement(By.cssSelector("#gbqfq"));

     nameElement.sendKeys("android ");
     xpathElement.sendKeys("driver ");
     cssElement.sendKeys("webdriver");
     nameElement.submit();
     System.out.println("Page title is: " + driver.getTitle());
     driver.quit();
}

Я использую JUnit 4 в качестве тестового прогона (следовательно, аннотацию @Test), однако этот код также должен работать в JUnit 3.

Обратите внимание:

  • Я намеренно использовал 3 отдельных элемента WebElements, которые ссылаются на один и тот же элемент HTML
  • каждый sendKeys(...) вызов добавляет текст в поисковый запрос
  • Технически нам не нужно отправлять поисковый запрос, чтобы продемонстрировать By(...) пункты работают, однако хорошо видеть, как выполняется код и получать подходящие результаты поиска.
  • Я закомментировал запрос на загрузку главной страницы поиска Google, но оставил его в своем ответе, чтобы вы могли легко увидеть, как использовать сайт Google вместо статической локальной HTML-страницы.
  • Я провел тест с локально подключенным телефоном Nexus 4 через USB и использовал локально созданный экземпляр AndroidDriver(),

Работает хорошо для меня.

//Author: Oleksandr Knyga
function xPathToCss(xpath) {
    return xpath
        .replace(/\[(\d+?)\]/g, function(s,m1){ return '['+(m1-1)+']'; })
        .replace(/\/{2}/g, '')
        .replace(/\/+/g, ' > ')
        .replace(/@/g, '')
        .replace(/\[(\d+)\]/g, ':eq($1)')
        .replace(/^\s+/, '');
}
Другие вопросы по тегам