Python Selenium:如何等待并切换到动态 iframe?

Posted

技术标签:

【中文标题】Python Selenium:如何等待并切换到动态 iframe?【英文标题】:Python Selenium: How to wait and switch to a dynamic iframe? 【发布时间】:2018-12-11 03:45:30 【问题描述】:

我目前正在抓取this website。

该网站嵌入了谷歌地图 iframe。每次我在搜索框中输入地址时它都会刷新。 在地图刷新完成之前如何检查?

我目前正在使用:

 WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)")))

我不确定这是否有效,因为我的互联网速度太快,无法测试。

我在 selenium 网站上查看了definitions of waits,但我不明白它们的意思。

我还发现 a post 使用相同的方法,但不确定它是仅等待 iframe 最初加载还是也等待它更改。

【问题讨论】:

【参考方案1】:

根据您的问题,如果您打算切换到标识为 (By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)")<iframe>,您需要诱导 WebDriverWait 以使 <iframe> 可用并切换到它 您可以使用以下解决方案:

WebDriverWait(driver, 10).until(EC.frame_to_be_available_and_switch_to_it((By.CSS_SELECTOR,".gm-style > iframe:nth-child(2)")))

【讨论】:

【参考方案2】:

我试过这段代码:

driver.get('https://www.bungol.ca/map/location/scarborough/?')
time.sleep(3)

refresh_count = 0
while True:
    try:
        driver.refresh()
        # WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)")))
        el = driver.find_element_by_css_selector(".gm-style > iframe:nth-child(2)")
        assert el.is_displayed()
        refresh_count += 1
    except Exception:
        print("Refresh count = " + str(refresh_count))

输出是:

Refresh count = 0
Refresh count = 43
Refresh count = 44
Refresh count = 56
Refresh count = 62
Refresh count = 63
Refresh count = 64
Refresh count = 68
Refresh count = 69

iframe 不在 DOM 的 0、43、44、...处。第一次失败是因为第一次加载时间长。然后很好,我决定通过将Chrome 切换到移动版本来模拟慢速连接。然后它已经相对经常失败了。

然后我设置了WebDriverWait:

while True:
    try:
        driver.refresh()
        WebDriverWait(driver, 120).until(EC.presence_of_element_located((By.CSS_SELECTOR, ".gm-style > iframe:nth-child(2)")))
        el = driver.find_element_by_css_selector(".gm-style > iframe:nth-child(2)")
        assert el.is_displayed()
        refresh_count += 1
    except Exception:
        print("Refresh count = " + str(refresh_count))

它没有抛出任何异常。所以你可以使用EC.presence_of_element_...

【讨论】:

以上是关于Python Selenium:如何等待并切换到动态 iframe?的主要内容,如果未能解决你的问题,请参考以下文章

selenium webdriver从安装到使用(python语言),显示等待和隐性等待用法,切换窗口或者frame,弹框处理,下拉菜单处理,模拟鼠标键盘操作等

python+selenium六:隐式等待

Selenium 在搜索元素时等待了很多

Python Selenium 2 API 并等待 DOM 准备好/元素可见

在 Selenium Web Driver 中处理警报后如何切换回主窗口

关于Selenium3+python3.6自动化测试中iframe切换