Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Выбор элемента из выпадающего списка с помощью WebDriver

webdriver
java
Теги: #<Tag:0x00007f7b64810a38> #<Tag:0x00007f7b64810808>

(iczaur) #1

Ребят помогите, пожалуйста. Сталкнулся с такой проблеммой. Есть меню, оно представленно выпадающим списком, список раскрывается после наведения курсора на пункт меню. Пробовал разные способы нажать на нужный пункт меню, ничего не выходит. Вот пара способов способов

public class MainPage {
    WebDriver driver;
    WebElement element, onElement;
    Actions a;
    public  MainPage(WebDriver driver) {
        this.driver  = driver;
    }

    public void setElement() {
        element = driver.findElement(By.xpath("//span[@class ='iceMnuBarItemLabel' and text()='Задачи']"));
        onElement = driver.findElement(By.xpath("//span[@class ='iceMnuItmLabel' and text()='Сводные отчёты']"));
        a.moveToElement(element).build().perform();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        onElement.click();
    }
}
public class MainPage {
    WebDriver driver;
    WebElement element, onElement;
    Actions a;
    public  MainPage(WebDriver driver) {
        this.driver  = driver;
    }
    public void setElement() {

        element = driver.findElement(By.xpath("//span[@class ='iceMnuBarItemLabel' and text()='Задачи']"));
        onElement = driver.findElement(By.xpath("//span[@class ='iceMnuItmLabel' and text()='Сводные отчёты']"));
        a.moveToElement(element).build().perform();
        driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
        onElement.click();
    }
}

У меня ничего не вышло, может я совсем не туда лезу?


(Shaman) #2

в Java Webdriver есть класс обертка для селекторов:

 

Select selector = new Select(driver.findElement(By.xpath(someLocator)));

 

ну и вот API этого класса обертки, дальше думаю все просто.


(iczaur) #3

Спасибо большое, помогло 


(iczaur) #4

Снова вынужден поднять тему.

И так.

Есть выпадающее меню. Нужно выбрать пункт из этого меню. Список раскрывается при наведении на кнопку.

Вот класс в котором описан клик на нужную ссылку

import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.interactions.Action;
import org.openqa.selenium.interactions.Actions;

public class HomePage {

    private WebDriver driver;
    private Actions actions;

    public HomePage(WebDriver driver) {
        this.driver = driver;
    }

    public Customers getCustomer(WebDriver driver, String xpathCustomer,
                                 String xpathCalls) {


        actions = new Actions(this.driver);
        WebElement customers = driver.findElement(By.xpath(xpathCustomer));
        WebElement receivingCalls = driver.findElement(By.xpath(xpathCalls));
        actions.moveToElement(customers).click(receivingCalls);
        Action muveAndClick = actions.build();
        muveAndClick.perform();

        return new Customers(driver);
    }

}

А вот сам тест

import static org.junit.Assert.*;

import java.util.concurrent.TimeUnit;

import org.junit.Before;
import org.junit.BeforeClass;
import org.junit.Test;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.chrome.ChromeDriver;

public class Tests {

    private static WebDriver driver;

    @BeforeClass
    public static void setUp() {
        System.setProperty("webdriver.chrome.driver", "D://chromedriver.exe");
        driver = new ChromeDriver();
        driver.manage().timeouts().implicitlyWait(102, TimeUnit.SECONDS);
        driver.get("http://robot2:38204/argus/home/home.seam");

    }

    @Test
    public void login() {

        LogonPage logPage = new LogonPage(driver);

        HomePage home = logPage.logon("j_username", "developer", "j_password",
                                      "developer", "//td/input[@class = 'login-button']");
    }

    @Test
    public void customers() {

        HomePage home = new HomePage(driver);

        Customers customer = home.getCustomer(driver,
                                              "//span[@class ='iceMnuBarItemLabel' and text() = 'Клиенты']",
                                              "//a[@id='j_id30:j_id34:j_id55:j_id56:link']");

    }

В реальности происходит магия
Если закрыть эклипс и открыть его снова то тест может пройти несколько раз. Т.е. выбирается нужный элемент.
Дальше происходит лишь визуальное “кликанье”. То есть можно увидеть (правда эт происходит очень быстро) как открывается список, и вроде бы что то нажимается. Но клика и соответсвенно перехода на другую страницу не происходит.
Помогите пожалуйста разобраться


(Alexander Petrovich) #5

"//a[@id='j_id30:j_id34:j_id55:j_id56:link']"

У вас этот айдишник часом не динамический?

Попробуйте в экшенах реализовать только наведение на элемент.

Потом отдельно паузу и клик


(iczaur) #6

Нет, id не динамический, пробовал и другной xpath “//span[@class=‘iceMnuItmLabel’ and text() = ‘Прием обращений’]”

Попробовал вот так

public Customers getCustomer(WebDriver driver, String xpathCustomer,
                             String xpathCalls) {
    actions = new Actions(this.driver);
    WebElement customers = driver.findElement(By.xpath(xpathCustomer));
    WebElement receivingCalls = driver.findElement(By.xpath(xpathCalls));
    actions.moveToElement(customers);
    Action muveAndClick = actions.build();
    muveAndClick.perform();
    actions.moveToElement(customers).click(receivingCalls).build().perform();
    return new Customers(driver);
}

Может конечно и не правельно, но работате так же - 1 раз на 5й


(Alexander Petrovich) #7

Я ж говорю, запилить Action не moveAndClick а просто move. 
Потом паузу. Потом обычный element.click()


(Anatoliy Velikokhatskiy) #8

Обьясните пожалуйста подробнее как выбрать значение из выпадающего списка.


(Anatoliy Velikokhatskiy) #9

Использовал такой клас:

import org.openqa.selenium.support.ui.Select;

Select select = new Select(driver.findElement(By.xpath("//form[@id='addClientForm']/div/div[6]/div/span/span/span[2]")));
select.selectByVisibleText("Albania");
```
 но не работает, в чем ошибка?

(vmaximv) #10