Подтвердить что ты не робот

Как переключаться между кадрами в Selenium WebDriver с помощью Java

Я использую java с WebDriver. Мне нужно переключаться между двумя кадрами. Я записал тестовый пример в Selenium IDE и тем, что получил значения как selectFrame relative = верхний выбор Frame = middle Frame

Но есть проблема, что он не может распознать relative = top и middleFrame. Как решить эту проблему в Selenium WebDriver с Java?

4b9b3361

Ответ 1

Метод WebDriver driver.switchTo().frame() принимает один из трех возможных аргументов:

  • Число.

    Выберите кадр по индексу (на основе нуля). То есть, если страница имеет три кадры, первый кадр будет иметь индекс 0, второй - при индексе 1а третий - в индексе 2. Как только кадр выбран, все последующие вызовы в интерфейсе WebDriver приводятся к этому кадру.

  • Имя или идентификатор.

    Выберите кадр по его имени или идентификатору. Рамки, расположенные по совпадающему имени атрибутам всегда присваивается приоритет над сопоставленными идентификаторами.

  • Ранее найденный WebElement.

    Выберите фрейм, используя его ранее расположенный WebElement.

Получить фрейм по нему id/name или найти его driver.findElement(), и все будет хорошо.

Ответ 2

для переключения на кадр:

driver.switchTo.frame("Frame_ID");

чтобы снова переключиться на значение по умолчанию.

driver.switchTo().defaultContent();

Ответ 3

Сначала вам нужно найти идентификатор кадра и определить его в WebElement

Для ex: - WebElement fr = driver.findElementById("id");

Затем переключитесь на фрейм с помощью этого кода: - driver.switchTo().frame("Frame_ID");

Пример script: -

WebElement fr = driver.findElementById("theIframe");

driver.switchTo().frame(fr);

Then to move out of frame use:- driver.switchTo().defaultContent();

Ответ 4

Этот код находится в groovy, поэтому, скорее всего, вам нужно будет немного переработать. Первый параметр - это url, второй - это счетчик, который ограничивает попытки.

public boolean selectWindow(window, maxTries) {
    def handles
    int tries = 0
    while (true) {
        try {
            handles = driver.getWindowHandles().toArray()
            for (int a = handles.size() - 1; a >= 0 ; a--) { // Backwards is faster with FF since it requires two windows
                try {
                    Log.logger.info("Attempting to select window: " + window)
                    driver.switchTo().window(handles[a]);
                    if (driver.getCurrentUrl().equals(window))
                        return true;
                    else {
                        Thread.sleep(2000)
                        tries++
                    }
                    if (tries > maxTries) {
                        Log.logger.warn("Cannot select page")
                        return false
                    }
                } catch (Exception ex) {
                    Thread.sleep(2000)
                    tries++
                }
            }
        } catch (Exception ex2) {
            Thread.sleep(2000)
            tries++
        }
    }
    return false;
}

Ответ 5

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

driver.switchTo().defaultContent()

Ответ 6

Вы также можете использовать:

driver.switch_to.frame(0)

(0) является первым iframe на html.

чтобы вернуться к содержимому по умолчанию:

driver.switch_to.default_content()

Ответ 7

Существует также возможность использовать WebDriverWait с ExpectedConditions (чтобы убедиться, что Frame будет доступен).

  • С строкой как параметр

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt("frame-name"));
    
  • С помощью локатора в качестве параметра

    (new WebDriverWait(driver, 5)).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("frame-id")));
    

Более подробную информацию можно найти здесь