Как переключиться на новую вкладку в Jmeter Selenium с помощью интерпретатора Javascript?

Я пишу тест селена, используя javascript в Jmeter. Когда я нажимаю на ссылку на сайте, она по умолчанию открывается в новой вкладке. Автоматизированный браузер даже переключается на эту новую вкладку. Но, кажется, селен не переключается на новую вкладку. Когда я печатаю внутренний HTML-код для элемента body (полученного с помощью xpath //body) после нажатия на ссылку, я получаю исходный код для первой вкладки, а не для второй.

Когда я пытаюсь дождаться какого-либо элемента на следующей странице (например, ожидая //div[@id="my-div-on-second-page-only"]), я получаю тайм-аут, говорящий, что элемент никогда не был обнаружен (спустя много времени после того, как я вижу, что страница завершила загрузку).

Я столкнулся с этим вопросом, но это для python, и я также изо всех сил пытаюсь понять принятый ответ.

Обновлять

Мой код для переключения вкладок в настоящее время выглядит так:

// Switch tabs
var tabs = WDS.browser.getWindowHandles();
var tab = WDS.browser.getWindowHandle();
WDS.log.info("Tabs: " + tabs + " current: " + tab); // Output below

// Assume always there are only two tabs
for (t in tabs)
{
    WDS.log.info("Checking tab " + t);
    if (t != tab)
    {
        WDS.log.info("Switching to " + t);
        WDS.browser.switchTo().window(t);
        break;
    }
}

Вывод для строки, отмеченной // Output below:

Tabs: [CDwindow-A83928D86BA4F6F46C5D7F4B63B674A5, CDwindow-177CF406C98C28DF4AF5E7EC3228B896] current: CDwindow-A83928D86BA4F6F46C5D7F4B63B674A5

Я даже не вхожу в цикл for/in. Я пробовал переключаться с помощью tabs[index], tabs.get(0); и tabs.iterator.next();, но ни один из них не работал. Я весь день рыскал в Интернете в поисках информации о типе данных, возвращаемом WDS.browser.getWindowHandles();, но никак не мог ее найти.

Обновление 2

В конце концов я переключился на интерпретатор Java. Ни одно из предложенных решений, даже в javascript, не сработало. Я подозреваю, что проблема связана с самим интерпретатором javascript. Я собираюсь оставить вопрос открытым на случай, если кто-то захочет предложить решение, которое протестировано и работает в расширении веб-драйвера Jmeter для будущих знаний.

Ниже мой рабочий код Java. Он использует пример Матиаса Домингеса, в котором предполагается, что последняя запись в tabs является новой вкладкой. Хотя я считаю, что решение Майка Кука кажется лучшим с точки зрения общего решения, решение Матиаса было достаточно для моей проблемы.

// Switch tabs
ArrayList tabs = new ArrayList(); // Jmeter interpreter uses <String> by default
tabs.addAll(WDS.browser.getWindowHandles());
String tab = WDS.browser.getWindowHandle();
WDS.log.info("Tabs: " + tabs + " current: " + tab + " Size of tabs: " + tabs.size());
WDS.browser.switchTo().window(tabs.get(tabs.size() - 1));
WDS.log.info("Tabs switched successfully");

person jaredad7    schedule 20.03.2018    source источник
comment
Я нашел это в Google: softpost.org/selenium-with-node-js/   -  person Chris G    schedule 20.03.2018
comment
Хотя визуально окно может быть сфокусировано на новой вкладке, ваш драйвер все еще работает в контексте исходного дескриптора окна. Это может варьироваться в зависимости от браузера, но обычно вы должны явно указать драйверу переключать дескрипторы окна каждый раз, когда вы хотите взаимодействовать с новым дескриптором.   -  person sytech    schedule 20.03.2018
comment
Можете ли вы обновить вопрос с вашими испытаниями кода?   -  person DebanjanB    schedule 20.03.2018
comment
Возможный дубликат заголовка stackoverflow.com/questions/9588827/   -  person Alexey Dolgopolov    schedule 20.03.2018
comment
Не дубликат. Это конкретно про javascript. Это про джаву.   -  person jaredad7    schedule 21.03.2018


Ответы (4)


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

List<String> tabs = new ArrayList<>();
tabs.addAll(driver().getWindowHandles());
String newTab = null;

targetElement.click();

for (String currentWindow: driver().getWindowHandles()) {
    if (!tabs.contains(currentWindow)) {
        newTab = currentWindow;
        break;
    }
}
person Mike Cook    schedule 20.03.2018

Когда вы щелкаете ссылку и открываете новую вкладку, драйвер по-прежнему фокусируется на первой вкладке, поэтому вам нужно перейти к ней:

List<String> tabs = new ArrayList<>();
tabs.addAll(driver().getWindowHandles());
driver().switchTo().window(tabs.size() - 1);

Это позволит получить все дескрипторы окон и перейти к последней открытой вкладке, после чего вы сможете найти (Элемент).

person Matias Dominguez    schedule 20.03.2018
comment
Предполагать, что вновь открытая вкладка находится на месте с индексом 1 в ArrayList, опасно. Если драйвер уже содержит более 2 WindowHandles (окна/вкладки), новая вкладка будет помещена, например, в индекс 2. Вместо этого получите последний элемент из ArrayList. - person S. Van den Wyngaert; 20.03.2018
comment
Хороший вопрос, но я не хотел давать полное объяснение, другой способ - перебрать все дескрипторы и сопоставить driver().getTitle() (если вы это знаете). - person Matias Dominguez; 20.03.2018
comment
Я использую javascript для этого теста, и у меня возникли проблемы с извлечением окна из любого возвращаемого объекта getWindowHandles(). Я пробовал tabs[0], tabs.get(0) и tabs.iterator.next(), но ничего не работает. - person jaredad7; 20.03.2018

Вы можете сделать что-то вроде ниже.

var full_tabs = WDS.browser.getWindowHandles();
var x = full_tabs.toString();
var arr = x.split(',');
var newtab = arr[arr.length-1].split(']').toString().replace(',','').replace(' ','');

Это не лучшее решение, но оно будет работать. Вы можете объединить его в 2 линии.

person Himanshu Jaiswal    schedule 08.06.2021

Вы можете переключаться между вкладками, вызывая следующий метод:

public void setMainWindow() {
    try{
        int numberOfWindow = driver.getWindowHandles().size();
        boolean tmpIndex = true;

        String mainWindowHandler = driver.getWindowHandle();        // Store the current window handle
        if (numberOfWindow > 1) {
            for(String winHandle : driver.getWindowHandles()){
                driver.switchTo().window(winHandle);                // Switch to new window opened
                if (tmpIndex) {
                    mainWindowHandler = winHandle;
                }
                tmpIndex = false;
            }

                                                                    // Perform the necessary actions on new window          
            driver.close();                                         // Close the new window, if that window no more required
            driver.switchTo().window(mainWindowHandler);            // Switch back to original browser (first window)
        }
    } catch (Exception e) {}
}

// Continue with original browser (first window)...
person Ali Azam    schedule 21.03.2018