Как переключиться на фрейм, когда тег body скрыт с помощью style="overflow: hidden;"

На странице PeopleSoft, если я нажму на поиск, появится новый виджет, мне нужно выбрать один из вариантов.

DOM был разработан таким образом, что в теге body есть «style = «overflow: hidden;»», с помощью приведенного ниже xpath я могу идентифицировать фрейм в google chrome, однако я не мог переключиться на фрейм и нажмите на опцию, которую мне нужно выбрать

HTML iframe:

<iframe frameborder = "0" id = "ptModFrame_2" name = "ptModFrame_2" src = "https://*******:8560/psc/umcssi2/EMPLOYEE/SA/c/SSR_PROG_ENRL.SSR_APT_REQ_RUNCNT.GBL?ICType=Panel&amp;ICElementNum=0&amp;ICStateNum=7&amp;ICResubmit=1&amp;ICAJAX=1&amp;" style = "width: 514px; height: 350px;"></iframe>

Я попытался с помощью приведенного ниже xpath переключиться на фрейм:

Xpath для переключения на фрейм: //div[@id='pt_modals']/div[2]/div/div[2]/iframe[contains(@src,'https://*******')]

Xpath для выбора опции после переключения:

driver.findElement(By.xpath("//table/tbody/tr[4]/td[1]")).click();

Примечание. Я также пробовал javascript-исполнитель.

js.executeScript("arguments[0].click();",driver.findElement(By.xpath("//table/tbody/tr[4]/td[1]")));

Я только что создал тот же DOM,

<body class = "PSPAGE" id = "ptifrmtemplate" style = "overflow: hidden;"><div id = "ptpopupmask" style = "display: none;">&nbsp;</div>

Я ожидаю, что он должен щелкнуть, но в первую очередь он не переключается на кадр.

Поделитесь html с фреймом и своим кодом

Sers 26.03.2019 20:06

Этот DOM довольно большой, могу ли я поделиться форматом

Jagadeesh 26.03.2019 20:11

Вам не нужно делиться всем DOM, возможно, будет достаточно HTML, охватывающего тег <iframe> / <frame> и нужный элемент вместе с его родительским тегом.

undetected Selenium 26.03.2019 20:42
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
3
294
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Попробуйте дождаться кадра, используя WebDriverWait

WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.id("ptModFrame_2")));

wait.until(ExpectedConditions.elementToBeClickable(By.xpath("//table/tbody/tr[4]/td[1]"))).click();

Спасибо за ответ, он также работает после переключения на содержимое по умолчанию, driver.switchTo().defaultContent();

Jagadeesh 27.03.2019 13:56
Ответ принят как подходящий

Чтобы переключиться на желаемый <iframe>, вам нужно вызвать WebDriverWait для желаемого кадр должен быть доступен и переключиться на него, и вы можете использовать любой из Стратегии поиска:

  • xpath:

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.xpath("//iframe[starts-with(@id, 'ptModFrame_') and contains(@src, 'psc/umcssi2/EMPLOYEE/SA/c/SSR_PROG_ENRL.SSR_APT_REQ_RUNCNT.GBL')]")));
    
  • cssселектор:

    new WebDriverWait(driver, 10).until(ExpectedConditions.frameToBeAvailableAndSwitchToIt(By.cssSelector("iframe[id^='ptModFrame_'][src*='psc/umcssi2/EMPLOYEE/SA/c/SSR_PROG_ENRL.SSR_APT_REQ_RUNCNT.GBL']")));
    

Другие вопросы по теме