Не работает драйвер в новом табе. Actions. selenium webdriver

java
webdriver
selenium
testng
Теги: #<Tag:0x00007fedbb931420> #<Tag:0x00007fedbb9312e0> #<Tag:0x00007fedbb931178> #<Tag:0x00007fedbb931038>

(Mr Ds Low) #1

Тест должен открывать страницу 1. Верифицировать эл. Кликать по нему. Переходить в новый, открытый таб (страница 2). Верифицировать страницу и элементы там. …

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

Unity.class (тестовый)

public
        void NSIValidationTest (String nsiName) //nsiName - названия справочников в НСИ
        {
            Login objLogin = new Login(driver);
            objLogin.loginToSMTP(USER_NAME,
                                 PASSWRD);
            NSIValidation objNSI = new NSIValidation(driver);
            objNSI.nsiAssert();
            try {
                assertEquals(nsiList.contains(nsiName),
                             true);
            } catch (Exception e) {
                logger.error("NSI ERROR", e);
                throw (e);
            }
        }
public static
        void tab2(WebDriver driver)
        {
            new Actions(driver).sendKeys(Keys.CONTROL)
                               .sendKeys(Keys.NUMPAD2)
                               .build().perform();
        }

NSIValidation.class (инициализация всяких штук)

public
        void nsiAssert ()
        {

                new WebDriverWait(driver, 10)
                        .until(ExpectedConditions.textToBePresentInElement(strNSI, "НСИ"));
                strNSI.click();
                System.out.println("Кликнул по НСИ");
                Unity.tab2(driver);
                System.out.println("Перешел на таб 2");
            try {
                new WebDriverWait(driver, 10)
                        .until(ExpectedConditions.visibilityOf(strNSIPageTitle));
                System.out.println(strNSIPageTitle.getText());
                String nsiPageTitle = strNSIPageTitle.getText();
                System.out.println("Получил текст с тайтла НСИ");
                assertEquals(nsiPageTitle, NSI_EXPECT_TITLE);
                System.out.println("Сравнил тайтл с ожидаемым");
            } catch (Exception e) {
                logger.error("NSI PAGE VERIFICATION ERROR", e);
//                throw (e);
            }
        }

Лог:

[NSIValidation] [ERROR] NSI PAGE VERIFICATION ERROR
org.openqa.selenium.TimeoutException: Expected condition failed: waiting for visibility of Proxy element for: DefaultElementLocator 'By.xpath: /html[@class='k-webkit k-webkit60']/body/div[@id='vw-body-container']/div[@class='row'][1]/div[@class='pull-left']/h3[@id='headTitle']' (tried for 10 second(s) with 500 MILLISECONDS interval)
Caused by: org.openqa.selenium.NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"/html[@class='k-webkit k-webkit60']/body/div[@id='vw-body-container']/div[@class='row'][1]/div[@class='pull-left']/h3[@id='headTitle']"}

Я так понимаю проблема в методе переключения. Есть еще какие-то варианты кроме громоздких методов “якорей”? (Референс: WebDriver features: Робота с несколькими окнами (вкладками) одновременно при помощи Selenium Web Driver)
Или нужно что-то вроде инициализации драйвера для нового таба?


Как я могу открить в firefox две вкладки и переходить с одной на вторую при необходимости?
#2

Нужно переключать драйвер в новую табу.
driver.switchTo().window()
Методу window нужно передать имя табы, которое можно взять отсюда:
driver.getWindowHandles()


(Yaroslav Pernerovskyy) #3

Вот тут разжевали:


(Mr Ds Low) #4

Я уже поправил.

Вопрос не по теме.
Корректно ли делать так:

public
        void NSIValidationTest (String nsiName) //nsiName - названия справочников в НСИ
        {
            Login objLogin = new Login(driver);
            objLogin.loginToSMTP(USER_NAME,
                                 PASSWRD);
            String tabHandleBefore = driver.getWindowHandle();
            NSIValidation objNSI = new NSIValidation(driver);
            objNSI.nsiAssert();
            PageFactory.initElements(driver, this);
            try {
                List<String> nsiTextList = new ArrayList<>();
                for (WebElement match : nsiList) {
                    nsiTextList.add(match.getText());
                }
                System.out.println(nsiTextList);
                assertEquals(nsiTextList.contains(nsiName), true);
                driver.close();
                driver.switchTo().window(tabHandleBefore);
            } catch (Exception e) {
                logger.error("NSI ERROR", e);
                throw (e);
            }
        }

Если не понятно.
nsiList - это List <WebElements>.
Есть DataProvider. Проверка на то, чтобы в первом содержалось второе.
Запуск, клоз драйвера делается для метода.
Или есть более красивое решение?
objNSI.nsiAssert() можно игнорировать.