Ошибка Selenium (Java)- Обнаружен фрейм, но при попытке переключиться на него запрашивается исключение noSuchFrameException

#java #selenium #firefox #iframe #selenium-chromedriver

Вопрос:

Описание проблемы:

Я не могу переключиться на определенный кадр через Chrome v92, несмотря на то, что это легко сделать через Firefox.

Пример кода:

 @Test
    void auto_015_5() {
        int bet = 7;        
        driver.navigate().to("https://boademo.com/"); 
        driver.switchTo().frame(0);
        List < WebElement > counters = driver.findElements(By.xpath("//div[@class='counter']"));
        counters.get(0).click();     
        List < WebElement > marketOptions = driver.findElements(By.xpath("//div[@class='au-target market-option row nowrap can-place-bets']"));
        for (int i = 0; i <= (bet * 3) - 1; i  = 3) {
            WebElement currentOption = marketOptions.get(i);
            JavascriptExecutor je = (JavascriptExecutor) driver;
            if (i % 6 == 0 amp;amp; i >= 6) {
                je.executeScript("arguments[0].scrollIntoView(true);", marketOptions.get(i - 6));
            }
            currentOption.click();
        }
        
        driver.switchTo().defaultContent();
        driver.switchTo().frame(1);
    }
 

Шаги по воспроизведению:

Перейдите по ссылке

Переключитесь на нужный кадр (className = 'boa-iframe')

Выберите любое спортивное мероприятие из 'Matches' Lobby.

Выберите ЛЮБОЙ рынок, чтобы запросить купон на ставку (bottom-right).

Переключитесь на содержимое по умолчанию.

Попытайтесь переключиться на рамку купона ставки (className = 'boa-overlay-iframe')

 NoSuchFrameException()
 

скриншот html

Комментарии:

1. Пожалуйста, покажите код, который вы пробовали до сих пор ? и в чем же заключается ошибка ?

2. Ошибка — это не такой кадр

3. Что такое rt.acceptPopUp(); специально rt ?

4. Оставил его там случайно, ничего особенного. RT-это объект, который создает экземпляр моего класса TestRunner. acceptPopUp просто нажимает кнопку «Принять» во всплывающем окне

5. Пожалуйста, смотрите ниже, это работает в моем местном. Я надеюсь, что это сработает и для вас тоже.

Ответ №1:

  1. Вы можете переключиться на iframe с помощью явного ожидания.
  2. Индексация не является предпочтительной.

Пример кода :

 driver.manage().window().maximize();
WebDriverWait wait = new WebDriverWait(driver, 30);
driver.manage().timeouts().implicitlyWait(300, TimeUnit.SECONDS);
driver.get("https://boademo.com/");
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("button.button-agree"))).click();
int bet = 7;        
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe.boa-iframe")));
List < WebElement > counters = driver.findElements(By.xpath("//div[@class='counter']"));
counters.get(0).click();     
List < WebElement > marketOptions = driver.findElements(By.xpath("//div[@class='au-target market-option row nowrap can-place-bets']"));
for (int i = 0; i <= (bet * 3) - 1; i  = 3) {
    WebElement currentOption = marketOptions.get(i);
    JavascriptExecutor je = (JavascriptExecutor) driver;
       if (i % 6 == 0 amp;amp; i >= 6) {
            je.executeScript("arguments[0].scrollIntoView(true);", marketOptions.get(i - 6));
        }
        currentOption.click();
    }
driver.switchTo().defaultContent();

wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[class='boa-overlay-iframe']")));
System.out.println("You are inside boa-overlay-iframe");
 

Комментарии:

1. Код действительно работает для меня, однако моя проблема в том, что я не могу переключиться на iframe className = ‘boa-overlay-iframe’.

2. Где находится этот iframe ? Это будет потом counters.get(0).click(); ?

3. ДА. Он содержит купон на ставку, отображаемый в правом нижнем углу

4. @NickBorg : Обновлено выше в нижней части кода, дайте мне знать, если это сработает.

5. к сожалению, нет… org.openqa.selenium. Исключение по времени: Ожидаемое условие не выполнено: ожидание доступности кадра: По.cssSelector: iframe[класс=’boa-наложение-iframe’] (попытка в течение 30 секунд с интервалом 500 миллисекунд)