Ошибка при попытке закрыть вкладку и переключиться на другую вкладку с помощью селена / Java - PullRequest
0 голосов
/ 08 октября 2019

У меня есть окно с двумя вкладками. Я пытаюсь закрыть вкладку с определенным названием и переключить элемент управления на другую вкладку. Вот мой код:

public static void closeTheWindowWithTitle(String title) {

    ArrayList<String> tabs = new ArrayList<String> (driver.getWindowHandles());
    String mainWindow = driver.getWindowHandle();

    for(int i = 0; i < tabs.size(); i++) {

        log.debug("switched to " + driver.getTitle() + " Window");
        if(driver.getTitle().contains(title))
        {
            driver.switchTo().window(tabs.get(i));
            driver.close();
            log.debug("Closed the  " + driver.getTitle() + " Window");
        }
    }
    driver.switchTo().window(mainWindow);
}

Когда я запускаю свой код, я получаю следующее исключение:

org.openqa.selenium.NoSuchWindowException: no such window: target window already closed
from unknown error: web view not found

Я не могу понять, в чем проблема. Пожалуйста, помогите.

Ответы [ 3 ]

1 голос
/ 08 октября 2019

Я надеюсь, что это поможет вам решить вашу проблему, я не хочу предоставлять исправление кода, и я хочу объяснить вам детали процесса шаг за шагом.

Откройте браузер Firefox / IE / Chrome и перейдите к https://www.bbc.co.uk

WebDriver driver = new AnyDriveryourusing();
// set implicit time to 30 seconds
driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
// navigate to the url
driver.get("https://www.bbc.co.uk");

Получите идентификатор GU для текущего (родительского) окна, используя метод getWindowHandle(), присутствующий в веб-драйвере, и сохранитезначение в строке

// get the Session id of the Parent
String parentGUID = driver.getWindowHandle();

Нажмите кнопку «Открыть новое окно», приложение откроет новое окно со страницей Google.

// click the button to open new window
driver.findElement(By.id("two-window")).click();
Thread.sleep(5000);

Получите идентификаторы GU для двух окон (родительский +Google), используя метод getWindowHandles(), присутствующий в webdriver. Сохраните идентификаторы GU в коллекции наборов, этот набор будет иметь идентификаторы GU как родительского, так и дочернего браузеров

// get the All the session id of the browsers
Set allGUID = driver.getWindowHandles();

итерирует набор значений GUID, и, если значение является родительским значением, пропустите его, если не переключитесь наВ новом окне

// iterate the values in the set
for(String guid : allGUID){
    // one enter into if block if the GUID is not equal to parent window's GUID
    if(! guid.equals(parentGUID)){
        //todo
    }
}

Переключитесь на окно с помощью метода switchTo().window(), передайте GU ID дочернего браузера этому методу.

// switch to the guid
driver.switchTo().window(guid);

Найдите строку поиска на Google.comи найдите «success»

driver.findElement(By.name("q")).sendKeys("success");

Закройте вкладку Google / окно и вернитесь к родительской вкладке / окну браузера

// close the browser
driver.close();
// switch back to the parent window
driver.switchTo().window(parentGUID);
1 голос
/ 08 октября 2019

Я предполагаю, что WindowHandle вашего Main-Window изменился где-то по пути. Вы должны быть в состоянии решить вашу проблему, выполнив что-то похожее на предложенное решение здесь , то есть, получив все WindowHandles, итерируя по ним и, в конце концов, переключившись на [0], который должен быть единственнымслева, после закрытия второго.

0 голосов
/ 08 октября 2019

Вы были близки, но вы не переключали окна перед проверкой заголовка. Я обновил код до того, что должно работать.

public static void closeTheWindowWithTitle(String title)
{
    Set<String> tabs = driver.getWindowHandles();
    String mainWindow = driver.getWindowHandle();

    for(int i = 0; i < tabs.size(); i++)
    {
        // you need to switch to the window before checking title
        driver.switchTo().window(tabs.get(i));
        log.debug("switched to " + driver.getTitle() + " Window");
        if(driver.getTitle().contains(title))
        {
            driver.close();
            log.debug("Closed the  " + driver.getTitle() + " Window");
            break; // this breaks out of the loop, which I'm assuming is what you want when a match is found
        }
    }
    driver.switchTo().window(mainWindow);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...