Selenium/WebDriver switch_to parent_frame/default_content 返回 None

Selenium/WebDriver switch_to parent_frame/default_content returning None

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

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

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

我要:

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

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

当我 dismiss/accept 警报时,Dom 内容在 iframe [id='f2.1', id='f2.2']

中更新

第 3 步:我想从 div[id='ac']

获取更新的数据

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

有多种帧切换方式

按索引切换到框架:

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()