【问题标题】:Unable to switch out of nested frames into main page无法从嵌套框架切换到主页
【发布时间】:2019-07-17 18:10:11
【问题描述】:

我有一个程序可以在 PLM 平台 ENOVIA 上自动输入数据,其中包含我输入的特定信息。我正在使用 Selenium 浏览网页。有一段程序必须输入 4 个嵌套帧才能单击某个元素。它做得很好并进行了必要的编辑,我面临的问题是,当我尝试使用 switch_to.default_content() 退出框架回到 HTML 代码的顶部以返回主页时。出于某种原因,在它切换到嵌套框架的第 4 个子框架并进行这些编辑后,我看到窗口更改为仅包含这些框架及其中的内容,而第一个父框架之上没有任何内容。所以 switch_to.default_content() 似乎不起作用。

这是真正重要的代码,它切换到第四帧和最后一帧“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)

我尝试使用 switch_to.frame(framename) 从第 4 个父帧向后切换到第 1 个父帧,然后使用 switch_to.default_content() 仅抛出 NoSuchFrameException .我想要的只是能够退出框架,就像我进入它们一样,无需更改/删除窗口中的任何内容并返回顶级 HTML。

【问题讨论】:

  • 您有什么理由觉得 switch_to.default_content() 似乎不起作用?你是怎么得出这个结论的?

标签: python selenium selenium-webdriver iframe webdriverwait


【解决方案1】:

尝试查找所有 iframe 并切换到您需要的那个。

// 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

        }

【讨论】:

  • 我的问题是,一旦我与第 4 个嵌套框架中的元素进行 交互,所有其他元素都会被删除。我可以完全访问它。在框架内编辑元素时如何保持页面原样?
  • @A.Gomes 在编辑框架内的元素后,您无法找到任何 iframe
  • 我认为他正试图从 iframe 切换到主要内容。
  • 唯一存在的 iframe 是我在里面的 4 个嵌套的 iframe,这 4 个框架周围的所有其他元素都不存在。
  • @AppuMistri 是的,但是与iframe交互后主要内容消失了,只有那些存在于窗口中。这就是我所说的窗口变化的意思。所以我无法退出框架,因为没有什么可去的,我只是对为什么主要内容消失而只留下框架及其内容感到困惑。
【解决方案2】:

作为driver.switch_to.default_content() 的替代品,您还可以使用:

browser.switch_to.parent_frame()

更新

由于您仍然面临同样的问题,更好的方法是等待 elemDone.click() 步骤完成(JavaScript / Ajax 调用)可以为一些visibility_of_element_located()诱导WebDriverWait如下:

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)


结尾

“Malformed URL: can't access dead object” in selenium when trying to open google

【讨论】:

  • 不幸的是,这并不能解决我的问题,它与 default_content() 的结果相同。但是,我意识到只有当我尝试使用 send_keys() 或 click() 等命令与第 4 个嵌套框架中的元素进行交互时,窗口才会发生变化。除此之外,如果我只停止访问框架,我可以使用 parent_frame() 或 default_content() 完美地退出它们回到顶层并与其他元素交互。关于可能导致这种情况的任何想法?
  • @A.Gomes 查看答案更新并让我知道状态。
  • 这进一步帮助我缩小问题的范围。根据您的 page root (grandparent) -> iframe (parent) -> iframe (child) 的示例,在我的情况下,当我访问 iframe(childs) 的元素时,页面根被删除,但父框架及其所有子框架都存在。我总是可以重新加载网站并重新开始编辑序列,但我拒绝相信没有有效的方法可以将框架退出到页面根目录。
猜你喜欢
  • 1970-01-01
  • 2017-12-03
  • 2023-04-01
  • 2013-07-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多