Статьи

Как Selenium 4 Relative Locator может изменить способ тестирования?

Веб-страницы могут состоять из нескольких веб-элементов или элементов графического интерфейса, таких как переключатели, текстовые поля, раскрывающиеся списки, входы и т. Д. Веб-локаторы в контексте тестирования автоматизации Selenium используются для выполнения различных действий с веб-элементами страницы , Что не удивительно, что, будучи новым пользователем Selenium, первое, что мы стремимся изучить, это Selenium Locators.

Эти локаторы являются основой любой инфраструктуры автоматизации Selenium , независимо от типа выполняемого вами тестирования, от модульного тестирования до сквозного автоматического межбраузерного тестирования. Существует много типов используемых локаторов, таких как CSS Selector, XPath, Link, Text, ID и т. Д., Которые являются одними из самых популярных локаторов для автоматического кросс-браузерного тестирования. Пока что вы получаете 8 типов локаторов в Selenium. Это число, однако, изменится в новом выпуске Selenium 4. Интересно, почему?

Что ж, в Selenium 3.0 доступ к каждому элементу осуществляется отдельно, поскольку нет доступа к веб-элементу относительно соседних элементов. Именно здесь новый локатор в Selenium 4 (Alpha) может быть полезен, поскольку новые методы локатора позволяют находить близлежащие элементы на основе их визуального расположения относительно других элементов в DOM.

Ага!! Вы правильно поняли. Selenium 4 выпустит новый Locator, который был в планах в течение достаточно долгого времени, теперь называется Relative Locator. И в этом посте мы подробно расскажем, как использовать новейший локатор Selenium 4 для вашего ежедневного тестирования автоматизации.

Мы рассмотрели функции, которые вы можете ожидать от Selenium 4 в нашем предыдущем посте. И в этом посте мы упоминали, что будем более подробно рассказывать о новых функциях. Ну, вот оно.

Скачиваем Selenium 4 (Альфа)

Спору наиболее часто используемых веб — фреймворк автоматизации тестирования, Селен, широко используется для сквозного тестирования с особым специальным набором функций , которые обеспечивают превосходное качество автоматизированных кроссбраузер тестирования возможностей. Тем не менее, последний выпуск основного номера, то есть Selenium 3.0, был выпущен почти 3 года назад в октябре 2016 года. Хотя дата выпуска пока не определена, а официально Selenium 4 официально не выпущена, вы можете получить краткий обзор Alpha в Selenium 4 выпуск.

Для начала вам необходимо скачать Selenium 4 Alpha из репозитория Maven. На момент описания функциональности относительного локатора Selenium 4 в этой статье последняя версия была 4.0.0-alpha-3. Поскольку это альфа-версия Selenium, мы рекомендуем вернуться к стабильной версии, то есть 3.141.XX, если вы не хотите рисковать с производственным набором тестов, так как вы проверяете его с помощью автоматизации автоматизации Selenium.

Относительный локатор селена 4 — Методы

На данный момент методы относительного локатора Selenium 4 поддерживают использование с атрибутом withTagName. Ниже приведены параметры «относительного локатора», которые можно использовать в тестах автоматизации Selenium:

Относительный локатор

Описание

над

Веб-элемент для поиска / размещения появляется над указанным элементом.

ниже

Веб-элемент для поиска / размещения появляется под указанным элементом.

toLeftOf

Веб-элемент, который нужно найти / найти, отображается слева от указанного элемента.

toRightOf

Веб-элемент, который нужно найти / найти, появляется справа от указанного элемента.

около

Веб-элемент для поиска / размещения находится на расстоянии не более 50 пикселей от указанного элемента.

Вот скриншот реализации, который подчеркивает использование относительных локаторов в тестировании автоматизации Selenium ( Источник ).

Если вам интересно, как это делает Selenium, то с помощью JavaScript-метода getBoundingClientRect ( ). Этот метод JavaScript позволяет Selenium находить элементы, используя относительные локаторы для тестирования Selenium.

Selenium 4 Relative Locator — Использование

Методы для относительных локаторов в Selenium 4 перегружены и могут принимать относительный WebElement или By locator в качестве аргумента. Ниже показан пример использования относительного локатора для тестирования автоматизации Selenium с использованием обеих опций:

1
2
3
4
5
WebElement txt_label = driver.findElement(By.cssSelector("label[id='uname']"));
  
WebElement txt_label =  driver.findElement(withTagName("input").toRightOf(txt_label));
 
String txt_name = driver.findElement(withTagName("input").toLeftOf(By.id("some_button"))

Выполнить тестирование Selenium Automation с помощью относительного локатора

Давайте приступим к работе с новым локатором Selenium 4 Relative Locator для проведения автоматического кросс-браузерного тестирования Я собираюсь выполнить пробный запуск Selenium 4 (Alpha) вместе с локальным Chrome WebDriver. Но перед этим я собираюсь создать проект Maven для реализации и тестирования. Я буду использовать среду TestNG, так как она может быть легко интегрирована с Maven. Кроме того, из-за встроенных аннотаций (например, @BeforeClass, @AfterClass, @Test и т. Д.), Которые обеспечивают большую ясность в отношении запуска тестов автоматизации.

Читайте также: Полное руководство по аннотациям TestNG для тестирования автоматизации Selenium

Для обоих тестов, которые будут продемонстрированы далее, файл объектной модели проекта (pom.xml) для проекта Maven должен быть обновлен с помощью конфигурации проекта [включая Selenium 4 (Alpha)].

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
  <modelVersion>4.0.0</modelVersion>
  <groupId>Group-Name</groupId>
  <artifactId>Artifact-Name</artifactId>
  <version>0.0.1-SNAPSHOT</version>
  <build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <configuration>
                    <source>10</source>
                    <target>10</target>
                </configuration>
            </plugin>
        </plugins>
    </build>
  
    <dependencies>
        <dependency>
            <groupId>org.seleniumhq.selenium</groupId>
            <artifactId>selenium-java</artifactId>
            <version>4.0.0-alpha-3</version>
        </dependency>
        <dependency>
            <groupId>org.testng</groupId>
            <artifactId>testng</artifactId>
            <version>7.0.0</version>
            <scope>test</scope>
        </dependency>
        <dependency>
            <groupId>io.github.bonigarcia</groupId>
            <artifactId>webdrivermanager</artifactId>
            <version>3.0.0</version>
            <scope>compile</scope>
        </dependency>
         
        <dependency>
            <groupId>org.slf4j</groupId>
            <artifactId>slf4j-nop</artifactId>
            <version>1.7.28</version>
            <scope>test</scope>
        </dependency>
    </dependencies>
</project>

Пример 1 для относительных локаторов селена 4

В первом примере, демонстрирующем использование относительных локаторов Selenium 4, целью является автоматизация входа в LambdaTest . Поскольку проверка выполняется в браузере Chrome, необходимо убедиться, что Chrome WebDriver доступен на компьютере.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static org.openqa.selenium.support.locators.RelativeLocator.withTagName;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
  
import java.util.concurrent.TimeUnit;
  
public class MavenRelocators {
    private WebDriver driver;
    boolean status = false;
  
    @BeforeClass
    public void setUp(){
        System.setProperty("webdriver.chrome.driver","C:\\location-of-chromedriver.exe");
  
        driver = new ChromeDriver();
        driver.get("https://accounts.lambdatest.com/login");
        driver.manage().window().maximize();
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
  
    @AfterClass
    public void tearDown() throws Exception {
       if (driver != null) {
           driver.quit();
        }
    }
  
    @Test
    public void test_login_using_relative_locators_1(){
        // Find the label element above the login text box
         
        WebElement heightLabel = driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/h1"));
         
        // Locate the textbox where username should be inputted
         
        WebElement heightUserBox = driver.findElement(withTagName("input")
                                         .below(heightLabel));
         
        heightUserBox.sendKeys("user-name");
         
        // Locate the textbox where password should be inputted
         
        WebElement heightPasswordBox = driver.findElement(withTagName("input")
                 .below(heightUserBox));
         
        heightPasswordBox.sendKeys("password");
         
        // Locate the submit button
         
        WebElement submitbutton = driver.findElement(By.xpath("//*[@id=\'app\']/section/form/div/div/button"));
         
        submitbutton.click();
         
        //Wait for 10 seconds to observe the output
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
}

Найти поле ввода, в которое необходимо ввести имя пользователя, т.е. адрес электронной почты; Сначала мы определяем метку над полем ввода, используя метод By.xpath. Чтобы получить подробную информацию о веб-элементе, например, XPath, в этом случае вы должны использовать опцию Inspect в браузере Chrome.

Прохождение кода:

1
WebElement heightUserBox = driver.findElement(withTagName("input")

Как видно из приведенного выше оператора, входной аргумент метода FindElement — withTagName. При успешном выполнении возвращает объект RelativeLocator.RelativeBy. Вывод будет относиться к WebElement heightLabel.

Мы используем расположенный элемент, чтобы найти поле, в которое необходимо ввести имя пользователя. Поскольку элемент ввода (для имени пользователя) находится прямо под меткой, мы используем опцию ниже вместе с методом withTagName ().

1
2
3
4
5
6
7
WebElement heightLabel = driver.findElement(By.xpath("//*[@id='app']/section/form/div/div/h1"));
         
// Locate the textbox where username should be inputted
         
WebElement heightUserBox = driver.findElement(withTagName("input")
                          .below(heightLabel));
heightUserBox.sendKeys("user-name");

Веб-элемент, расположенный под полем ввода электронной почты, является полем ввода пароля. Поскольку относительное расположение ящика ввода электронной почты уже известно, для определения поля ввода пароля используется опция ниже.

1
2
3
WebElement heightPasswordBox = driver.findElement(withTagName("input")
                                     .below(heightUserBox));
heightPasswordBox.sendKeys("password");

Чтобы выполнить тест, щелкните правой кнопкой мыши проект и выберите опцию «Выполнить как -> TestNG Test».

Пример 2 для относительных локаторов селена 4

В этом примере, демонстрирующем использование относительных локаторов Selenium 4, предполагается добавить новую запись в образец приложения LambdaTest. Он состоит из двух других тестов, в которых искомый веб-элемент находится и проверяется с помощью его атрибута (name / id).

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
package RelativeLocators;
  
import io.github.bonigarcia.wdm.WebDriverManager;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.firefox.FirefoxDriver;
import org.testng.annotations.AfterClass;
import org.testng.annotations.BeforeClass;
import org.testng.annotations.Test;
import static org.openqa.selenium.support.locators.RelativeLocator.withTagName;
import static org.testng.Assert.assertEquals;
import org.testng.annotations.Test;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.concurrent.TimeUnit;
  
public class RelativeLocators {
    private WebDriver driver;
    boolean status = false;
  
    @BeforeClass
    public void setUp(){
        System.setProperty("webdriver.chrome.driver","C:\\Location-To\\chromedriver.exe");
  
        driver = new ChromeDriver();
        driver.manage().window().maximize();
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
  
    @AfterClass
    public void tearDown() throws Exception {
       if (driver != null) {
           driver.quit();
        }
    }
  
    @Test
    public void test_login_using_relative_locators_1(){
        String name = driver.findElement(withTagName("input")
                .above(By.name("li5"))
                .below(By.name("li3")))
                .getAttribute("name");
        assertEquals(name, "li4");
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
     
    @Test
    public void test_login_using_relative_locators_2(){
        String txt_name = driver.findElement(withTagName("input")
                .toLeftOf(By.id("addbutton"))
                .below(By.name("li5")))
                .getAttribute("id");
        assertEquals(txt_name, "sampletodotext");
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
     
    @Test
    public void test_login_using_relative_locators_3(){
        WebElement txt_name =  driver.findElement(withTagName("input")
                  .toLeftOf(By.id("addbutton"))
                  .below(By.name("li5")));
         
        txt_name.sendKeys("Relative locators test");
         
        // Get details of the Submit/Add button
        WebElement submitbutton = driver.findElement(By.xpath("//*[@id=\'addbutton\']"));
         
        // Submit the new entry
        submitbutton.click();
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
}

Давайте расшифруем вышеприведенный пример, который состоит из трех разных тестов. Прежде чем переходить к деталям любого теста, важно, чтобы мы взглянули на фрагмент DOM для приложения.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
17
18
<ul class="list-unstyled">
<!-- ngRepeat: sampletodo in sampleList.sampletodos --><li ng-repeat="sampletodo in sampleList.sampletodos" class="ng-scope">
    <input type="checkbox" ng-model="sampletodo.done" name="li1" class="ng-pristine ng-untouched ng-valid">
    <span class="done-false">First Item</span>
</li><!-- end ngRepeat: sampletodo in sampleList.sampletodos --><li ng-repeat="sampletodo in sampleList.sampletodos" class="ng-scope">
    <input type="checkbox" ng-model="sampletodo.done" name="li2" class="ng-pristine ng-untouched ng-valid">
    <span class="done-false">Second Item</span>
</li><!-- end ngRepeat: sampletodo in sampleList.sampletodos --><li ng-repeat="sampletodo in sampleList.sampletodos" class="ng-scope">
    <input type="checkbox" ng-model="sampletodo.done" name="li3" class="ng-pristine ng-untouched ng-valid">
    <span class="done-false">Third Item</span>
</li><!-- end ngRepeat: sampletodo in sampleList.sampletodos --><li ng-repeat="sampletodo in sampleList.sampletodos" class="ng-scope">
    <input type="checkbox" ng-model="sampletodo.done" name="li4" class="ng-pristine ng-untouched ng-valid">
    <span class="done-false">Fourth Item</span>
</li><!-- end ngRepeat: sampletodo in sampleList.sampletodos --><li ng-repeat="sampletodo in sampleList.sampletodos" class="ng-scope">
    <input type="checkbox" ng-model="sampletodo.done" name="li5" class="ng-pristine ng-untouched ng-valid">
    <span class="done-false">Fifth Item</span>
</li><!-- end ngRepeat: sampletodo in sampleList.sampletodos -->
</ul>

Пятый элемент в DOM представлен в DOM именем li5, а третий элемент представлен именем li3.

Под-тест 1 — В первом тесте должен быть найден элемент с именем li4 и выдан assert в случае ошибки. Метод findElement вызывается с помощью метода withTagName и вводится TagName. Как видно из дерева DOM и скриншота Inspect ниже, каждый CheckBox имеет тип ввода с именем, соответствующим опции ввода, т.е. li1, li2, li3 и т. Д.

Введите веб-элемент с именем li4 (четвертый элемент) выше li3 (третий элемент) и ниже li5 (пятый элемент). Следовательно, мы указываем оба из них как часть теста.

01
02
03
04
05
06
07
08
09
10
@Test
    public void test_login_using_relative_locators_1(){
        String name = driver.findElement(withTagName("input")
                .above(By.name("li5"))
                .below(By.name("li3")))
                .getAttribute("name");
        assertEquals(name, "li4");
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

Под-тест 2 — В этом тесте должен быть расположен элемент ввода с именем sampletodotext. Этот элемент имеет тип ввода и расположен слева от кнопки добавления, т.е. id = addbutton & ниже элемента с именем li5 (пятый элемент).

01
02
03
04
05
06
07
08
09
10
@Test
    public void test_login_using_relative_locators_2(){
        String txt_name = driver.findElement(withTagName("input")
                .toLeftOf(By.id("addbutton"))
                .below(By.name("li5")))
                .getAttribute("id");
        assertEquals(txt_name, "sampletodotext");
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

Утверждается, если имя элемента, т.е. txt_name, не соответствует ожидаемому имени, т.е. sampletodotext.

Под-тест 3 — Этот тест является логическим продолжением под-теста 2, где новый элемент / опция должна быть добавлена ​​в приложение lambdasample.

Для этого введите WebElement слева от элемента с id = addbutton [.toLeftOf(By.id("addbutton")] и ниже элемента с name = li5 [.below(By.name("li5"))] должен быть расположен.

Поскольку элемент input является текстовым полем, метод sendKeys используется для ввода значений в текстовое поле, т.е. id = sampletodotext. Новая опция добавляется в список путем нажатия кнопки «Добавить» на странице.

01
02
03
04
05
06
07
08
09
10
11
12
13
14
15
16
@Test
    public void test_login_using_relative_locators_3(){
        WebElement txt_name =  driver.findElement(withTagName("input")
                  .toLeftOf(By.id("addbutton"))
                  .below(By.name("li5")));
         
        txt_name.sendKeys("Relative locators test");
  
        // Get details of the Submit/Add button
        WebElement submitbutton = driver.findElement(By.xpath("//*[@id=\'addbutton\']"));
         
        // Submit the new entry
        submitbutton.click();
         
        driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }

Подобно Test-1, этот проект также должен быть выполнен как тест TestNG. Ниже показан снимок экрана, на котором видно, что в список добавлен последний параметр, т. Е. Тест «Относительные локаторы».

Мы уверены, что к настоящему моменту вы бы хорошо владели относительным локатором Selenium 4 для автоматизации тестирования Selenium. Поскольку это альфа-версия Selenium 4, вам может потребоваться больше времени, прежде чем поддержка относительных локаторов начнет распространяться на другие языки программирования, такие как Python, C # и т. Д.

Каково ваше мнение о новом локаторе?

Относительный локатор в Selenium 4 — интересное усовершенствование, с помощью которого разработчики могут получить доступ к близлежащим веб-элементам с меньшим количеством реализаций. Поскольку это альфа-версия, функции могут измениться в следующих версиях. Важно отметить, что методы относительного локатора Selenium 4, то есть выше, ниже, toLeftOf, toRightOf, near не работают с перекрывающимися элементами.

Если вы используете Java с Selenium для автоматического кросс-браузерного тестирования, вам непременно стоит попробовать Selenium 4 (Alpha). Хотя есть инструменты (как с открытым исходным кодом, так и коммерческие), которые предлагают функции, аналогичные Selenium 4 Relative Locator, Selenium 4 имеет много других функций (включая улучшенную документацию), которые стоят того, чтобы ждать!

Итак, что вы думаете о новом локаторе для тестирования автоматизации Selenium? Считаете ли вы новый Selenium 4 Relative Locator удобным? Вы уже планируете включить относительный локатор в свои сценарии автоматического кросс-браузерного тестирования? Или вы думаете, это могло бы быть лучше? Дайте мне знать ваше мнение в разделе комментариев ниже. Удачного тестирования! 🙂

Смотрите оригинальную статью здесь: Как Selenium 4 Relative Locator может изменить способ тестирования?

Мнения, высказанные участниками Java Code Geeks, являются их собственными.