Невозможно переключиться с вложенных фреймов на главную страницу

У меня есть программа, которая автоматически вводит данные на платформе PLM, ENOVIA, со специальной информацией, которую я ввожу. Я использую Selenium для навигации по веб-странице. Есть сегмент, где программа должна ввести 4 вложенных кадра, чтобы щелкнуть определенный элемент. Он делает это хорошо и вносит необходимые изменения. Проблема, с которой я сталкиваюсь, заключается в том, что я пытаюсь выйти из фреймов обратно в начало HTML-кода, чтобы вернуться на главную страницу с помощью switch_to.default_content(). . По какой-то причине, после того, как он переключается на 4-й дочерний элемент вложенных фреймов и вносит эти изменения, я вижу, что окно изменяется и состоит только из этих фреймов и того, что в них, и ничего выше 1-го родительского фрейма. Так что switch_to.default_content() не работает.

Это код, который действительно имеет значение, когда он переключается на 4-й и последний кадр «DSCObjectSummary» и вносит эти правки.


def clickCheck(Method, Locator, elemName):
    #Add If Else to check for element availibility
    #Do Retries of searchess
    try:
        wait.until(EC.element_to_be_clickable((Method, Locator)))
        print(elemName + ' Clickable')
    except NoSuchElementException:
        print("Cannot Find Element")

...... Lots of code and comes to this point
    #Switching into 4 nested frames to click "EDIT DETAILS" Button
    wait.until(EC.frame_to_be_available_and_switch_to_it("content"))
    wait.until(EC.frame_to_be_available_and_switch_to_it("detailsDisplay"))
    wait.until(EC.frame_to_be_available_and_switch_to_it("portalDisplay"))
    wait.until(EC.frame_to_be_available_and_switch_to_it("DSCObjectSummary"))
    clickCheck(By.ID, 'DSCEditObjectSummary', "Edit Details")
    elemEdit = browser.find_element_by_id("DSCEditObjectSummary")
    elemEdit.click()

    #Click the Customer Dropdown
    clickCheck(By.ID, "PMCCustomerId", "Customer Dropdown")
    elemCust = browser.find_element_by_id("PMCCustomerId")
    elemCust.click()
    elemCust.send_keys("Ces")
    """Add If Conditions to check part number"""

    #Click Document Type Field
    clickCheck(By.ID, "PMCDocumentTypeId", "Document Type")
    elemDoc = browser.find_element_by_id("PMCDocumentTypeId")
    elemDoc.click()
    elemDoc.send_keys("MOD")

    """Add Check to see if part is Active/Obsol, if Obs, make Active"""

    #Click Dashnumber field
    clickCheck(By.ID, "PMCDashNumber", "Dash Number")
    elemDash = browser.find_element_by_id("PMCDashNumber")
    elemDash.click()
    elemDash.clear()
    elemDash.send_keys("-1")

    #Click Done Button
    clickCheck(By.CSS_SELECTOR, "button[class='btn-primary'][type='button']", "Done Button")
    elemDone = browser.find_element_by_css_selector("button[class='btn-primary'][type='button']")
    elemDone.click()

    browser.switch_to.default_content()
    time.sleep(20)

Я попытался переключиться назад с 4-го на 1-й родительский фрейм, последовательно используя switch_to.frame(framename), а затем используя switch_to.default_content(), чтобы получить исключение NoSuchFrameException. Все, что я хочу, это иметь возможность вернуться из фреймов, как я попал в них, ничего не меняя/удаляя в окне, и вернуться к HTML верхнего уровня.


person A.Gomes    schedule 17.07.2019    source источник
comment
По какой причине вы считаете, что switch_to.default_content() не работает? Как вы заключаете это?   -  person DebanjanB    schedule 17.07.2019


Ответы (2)


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

// find all your iframes
List<WebElement> iframes = driver.findElements(By.xpath("//iframe"));
        // print your number of frames
        System.out.println(iframes.size());

        // you can reach each frame on your site
        for (WebElement iframe : iframes) {

            // switch to every frame
            driver.switchTo().frame(iframe);

            // now within the frame you can navigate like you are used to

        }
person Sureshmani Kalirajan    schedule 17.07.2019
comment
Моя проблема в том, что все остальные элементы удаляются, как только я взаимодействую с элементами в своем 4-м вложенном фрейме. Я могу получить к нему доступ совершенно нормально. Как я могу сохранить свою страницу как есть, пока я редактирую элементы внутри фрейма? - person A.Gomes; 17.07.2019
comment
@A.Gomes, вы не можете найти фреймы после редактирования элементов внутри фреймов? - person Sureshmani Kalirajan; 17.07.2019
comment
Я думаю, что он пытается переключиться с iframe на основной контент. - person Appu Mistri; 17.07.2019
comment
Единственные существующие фреймы - это 4 вложенных, внутри которых я нахожусь, все остальные элементы вокруг этих 4 фреймов не существуют. - person A.Gomes; 17.07.2019
comment
@AppuMistri Да, но основной контент исчезает после взаимодействия с iframe, и в окне существуют только те, которые существуют. Вот что я имею в виду под изменением окна. Поэтому я не могу выйти из фреймов, так как не к чему идти, я просто запутался, почему основной контент исчезает только для того, чтобы покинуть фреймы и его содержимое. - person A.Gomes; 17.07.2019
comment
Если там нет контента, зачем переключаться? - person pcalkins; 17.07.2019
comment
Был контент до того, как я получил доступ к фреймам, и после редактирования элементов внутри фрейма я пытаюсь выйти обратно в этот контент. Но когда я делаю эти изменения внутри фрейма, окно меняется, чтобы отображать только фрейм, а не исходное содержимое. Я надеюсь, что это ясно. - person A.Gomes; 17.07.2019
comment
Вы можете опубликовать исходный код html? (один раз после редактирования элементов внутри кадра)? Я считаю, что мы все еще можем вернуться к корневому элементу и переключиться на него. И что произойдет, если вы сохраните редактирование или просто избежите его? - person Sureshmani Kalirajan; 17.07.2019

В качестве альтернативы driver.switch_to.default_content() вы также можете использовать:

browser.switch_to.parent_frame()

Обновлять

Поскольку вы все еще сталкиваетесь с той же проблемой, лучшим подходом было бы дождаться завершения шага elemDone.click() (JavaScript / вызовы Ajax), и вы можете вызвать WebDriverWait для некоторых visibility_of_element_located() следующим образом:

elemDone = browser.find_element_by_css_selector("button[class='btn-primary'][type='button']")
elemDone.click()
WebDriverWait(browser, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "css_of_an_element_which_gets_displayed_after_the_click")))
browser.switch_to.default_content()
# as an alternative use `switch_to.parent_frame()`
# browser.switch_to.parent_frame()

Примечание. В целях отладки вы можете заменить WebDriverWait на time.sleep(5).


Outro

"Уродливый URL: не удается получить доступ к мертвому объекту» в селене при попытке открыть Google

person DebanjanB    schedule 17.07.2019
comment
К сожалению, это не решает мою проблему, у него те же результаты, что и у default_content(). Однако я понял, что окно меняется только тогда, когда я пытаюсь взаимодействовать с элементами в 4-м вложенном фрейме с помощью таких команд, как send_keys() или click(). Кроме этого, если я остановлюсь только на доступе к фрейму, я смогу прекрасно выйти из них обратно на верхний уровень, используя parent_frame() или default_content() и взаимодействовать с другими элементами. Любые идеи относительно того, что может быть причиной этого? - person A.Gomes; 17.07.2019
comment
@A.Gomes Проверьте обновление ответа и дайте мне знать о статусе. - person DebanjanB; 17.07.2019
comment
Это еще больше помогает мне сузить проблему. Согласно вашему примеру корень страницы (прародитель) -> iframe (родительский) -> iframe (дочерний), в моем случае, когда я обращаюсь к элементам iframe(childs), корень страницы удаляется , но родительский фрейм и все его дочерние элементы существуют. Я всегда могу перезагрузить веб-сайт и перезапустить последовательность редактирования, но я отказываюсь верить, что нет эффективного способа выйти из фреймов обратно в корень страницы. - person A.Gomes; 17.07.2019