【问题标题】:Selenium/WebDriver switch_to parent_frame/default_content returning NoneSelenium/WebDriver switch_to parent_frame/default_content 返回无
【发布时间】:2019-10-27 18:30:57
【问题描述】:

我有以下代码,它是一个基于 Angular 的网站。

我有,Python 3.6/Selenium/ChromeDriver v-77。 我已经使用 switch_to 方法直到 iframe,id=f2.2 并关闭了在该框架中打开的警报。 然后我尝试了 switch_to.parent_frame() 和 switch_to.default_content()。 但两者都返回无。

<html>
   <head>
   </head>
   <body>
       <iframe id="f1"><iframe>      // 1
       <iframe id="f2">              // 2
              <iframe id="f2.1">              // 2.1
                    <iframe id="f2.2">        // 2.2
                       <a href='http://link.com'>
                       // on click alert, dismiss
                    </iframe>
                    <div id='ac'></div>
              </iframe>
       </iframe>
   </body
</html>

我想要:

第 1 步:进入 iframe [id='f2.2'] // 我到达了

第 2 步:从 iframe [id='f2.2'] 获取数据并在单击该框架中存在的按钮后关闭警报(ajax 请求)

当我关闭/接受警报时,Dom 内容会在 iframe [id='f2.1', id='f2.2'] 中更新

第 3 步:我想从 div[id='ac'] 获取更新的数据

我使用了等待,但无法获取数据。我也尝试保存 window_handles[0] 方法的响应,并在警报操作后使用,但它也不起作用。

【问题讨论】:

    标签: selenium iframe webdriver selenium-chromedriver python-3.6


    【解决方案1】:

    帧之间有多种切换方式

    按索引切换到帧:

    driver.switchTo().frame(0);
    driver.switchTo().frame(1);
    

    按名称或 ID 切换到框架:

     driver.switchTo().frame("iframe1");
     driver.switchTo().frame("id of the element");
    

    请尝试解决方案:

    from selenium import webdriver
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.support import expected_conditions as EC
    
    driver = webdriver.Chrome()
    driver.get("http://somedomain/url_that_delays_loading")
    try:
       driver.switchTo().defaultContent();
       driver.switchTo().frame(driver.findElement(By.id("f2")).findElement(By.id("f2.1")).findElement(By.id("f2.2")));
       wait = WebDriverWait(driver, 10)
       driver.find_element_by_link_text("http://link.com'").click()
       alert = driver.switch_to.alert
       alert_text = alert.text
       alert.dismiss()
       driver.switch_to.default_content()
       driver.switchTo().frame(driver.findElement(By.id("f2")).findElement(By.id("f2.1")));
       String text=driver.findElement(By.id("ac")).getText();
       System.out.println(text);
       driver.switch_to.default_content()
    
    finally:
        driver.quit()
    

    【讨论】:

    • 我在 Python 中尝试过所有这些方法,但在我的情况下都没有。
    • 这些只是切换到子框架的方法。
    • 我必须关闭或接受框架中的警报 (f2.2) 以及何时执行此操作,调用 ajax 调用并更新 Div[id='ac'] 的内容
    • 您必须明确说明您要执行哪些操作
    • 您使用的是哪个网站?如果可能的话,分享一下
    猜你喜欢
    • 2014-09-08
    • 1970-01-01
    • 2013-04-03
    • 2020-05-09
    • 2012-07-22
    • 2018-02-07
    • 2020-12-18
    • 2017-12-27
    • 2016-03-27
    相关资源
    最近更新 更多