Selenium中操作iframe,别再说你不会了

简介: Selenium中操作iframe,别再说你不会了

这里是清安,本章一起来了解一下ifame标签,iframe多用于嵌套页面。最常见的就是登录窗口了。例如QQ空间,知乎的登录界面,都有用到。本章主要以QQ空间为例,一起来看看:

进入Url:https://i.qq.com/

方法一:按下F12,鼠标点击登录框,审查元素,就能看到iframe框了。

方法二:按下F12,CTRL+F,在搜索框中输入iframe,也能搜索到。

简单的小脚本

好了, 此处看了iframe标签了。我们如何来定位呢。上述图片中有id,有name属性,所以我们正常进行定位切换就好了。

from selenium import webdriver
fox = webdriver.Firefox()
fox.get("https://i.qq.com/")
# 定位标签
ifranme = fox.find_element_by_id('login_frame')
# 切换到标签上
fox.switch_to.frame(ifranme)
fox.find_element_by_id('switcher_plogin').click()
fox.find_element_by_id('u').send_keys('清安无别事')
fox.find_element_by_id('p').send_keys('欢迎入坑')
fox.quit()

此处是一个小例子,我们使用switch_to.frame()可以切入到标签内部,然后进行各种操作。实际上可能会遇见没有任何属性的iframe,所以这时候就要考虑到标签定位了。这里回到了元素定位基础了,就不作多的阐述了。

往后还可能遇到一个HTML中存在多个iframe标签的情况,善于结合Python,Selenium基础来书写代码。原理都是一样的。

封装iframe讲解

那么切入进去之后如何切出呢,或者还有其他的办法切入吗。答案是有的。看封装好的一个小例子。这里就不解释如何封装的了,可以直接看看Python系列,有讲。

# -->>>清安<<<---
from selenium import webdriver
from selenium.webdriver.common.by import By
from time import sleep
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
class Test(object):
    def __init__(self):
        self.fox = webdriver.Firefox()
        self.fox.get('https://i.qq.com/')
    def get_element(self, ele, local):
        return self.fox.find_element(ele, local)
    def click_(self, ele, local):
        self.get_element(ele, local).click()
    def get_text(self, *local):
        sleep(1)
        txt = self.get_element(*local)
        print(txt.text)
    def frame_(self, ele, local):
        """
        :return: 切入frame
        """
        sleep(1)
        self.fox.switch_to.frame(self.get_element(ele, local))
    def parent_frame(self):
        """
        :return: 切出frame
        """
        sleep(1)
        # self.fox.switch_to.default_content()
        self.fox.switch_to.parent_frame()
    def wait_(self):
        """
        :return: 显示等待头部 
        """
        return WebDriverWait(self.fox, 10, 0.5)
    def wait_frame(self, ele, local):
        """
        :return: 显示等待+iframe标签的使用
        """
        self.wait_().until(EC.frame_to_be_available_and_switch_to_it(self.get_element(ele, local)),
                           message='iframe不可跳转')
if __name__ == '__main__':
    t = Test()  # 实例化类,直接打开url
    t.frame_(By.ID, 'login_frame')  # 定位iframe标签
    t.get_text(By.ID, 'switcher_plogin')    # 获取文本信息
    t.click_(By.ID, 'switcher_plogin')  # 点击操作
    t.get_text(By.ID, 'login_button')   # 获取文本信息
    t.parent_frame()    # 切出iframe
    t.get_text(By.XPATH, "//*[text()='空间活动']")  # 获取文本信息
    t.wait_frame(By.ID, 'login_frame')  # 用iframe显示等待
    t.get_text(By.XPATH, '//*[text()="新用户注册"]')     # 获取文本信息

此处举例了如何切出iframe,也就是parent_frame方法,里面介绍了两种方法。

self.fox.switch_to.parent_frame()是切换到父级,如果没有父级的iframe,那么保持默认,也就是说将焦点切出原iframe标签。

self.fox.switch_to.default_content()会直接将焦点切出iframe标签。

切出后我们就可以做其他的操作了。上述代码中,我们定位了“空间活动”,并打印了它的文本值。

上述代码中我们还用到了一个显示等待,也是有关iframe标签的,这也是一种切换方式。一起来看看源码:

class frame_to_be_available_and_switch_to_it(object):
    """ An expectation for checking whether the given frame is available to
    switch to.  If the frame is available it switches the given driver to the
    specified frame.
    """
    def __init__(self, locator):
        self.frame_locator = locator
    def __call__(self, driver):
        try:
            if isinstance(self.frame_locator, tuple):
                driver.switch_to.frame(_find_element(driver,
                                                     self.frame_locator))
            else:
                driver.switch_to.frame(self.frame_locator)
            return True
        except NoSuchFrameException:
            return False

看源码中,简单点理解:如果self.frame_locator是元组,则进行切换,否则,还是切换,并返回True。都不对,则告诉你错误,返回False。所以啊,用了这个显示等待也就不需要另外写iframe标签切换了。也能不加强制等待、担心时间不够元素没渲染出来,导致脚本报错了。

总结

1、上述的封装中,并未用到较多的显示等待,而是简单的使用了强制等待,这是不值得提倡的。

2、封装的套路可以模仿,自己写一写。

3、大家记得写好注释

4、上述代码中,切换iframe还有很大的优化空间,可以自己试试如何优化


目录
相关文章
|
6月前
|
Web App开发 测试技术
使用Selenium模拟鼠标滚动操作的技巧
本文介绍了使用Selenium进行Web自动化测试时如何模拟鼠标滚动操作。模拟滚动对于处理动态加载的内容至关重要。通过`ActionChains`类,可以实现向下滑动1000像素的操作。示例代码展示了如何结合滚动来截取长页面的完整图片。总结来说,Selenium的`ActionChains`使得模拟用户行为,如滚动,变得简单,便于执行自动化任务。
|
6月前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
【4月更文挑战第21天】本文介绍了Selenium中处理特殊测试场景的方法,如鼠标悬停。Selenium的Actions类提供了鼠标悬停功能,用于模拟用户在网页元素上的悬停行为。文中通过实例展示了如何使用Actions悬停并展开下拉菜单,以及在搜索时选择自动补全的字段。代码示例包括了打开百度首页,悬停在“更多”元素上显示下拉菜单并点击“音乐”,以及在搜索框输入关键词并自动补全的过程。
102 0
|
5月前
|
前端开发 测试技术 UED
使用Selenium WebDriver模拟用户操作防止滑动条验证
在进行Web自动化测试时,经常会遇到各种前端验证机制,如滑动条验证,这些机制设计用来防止自动化脚本模拟用户行为。在本文中,我们将探讨如何使用Selenium WebDriver来模拟用户操作,以规避这些验证机制。
|
6月前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
67 0
|
3月前
|
设计模式 Java 测试技术
【Selenium使用误区】Iframe元素定位失败:避免误提GitHub Issue的技巧
本文分享了作者在使用Selenium进行UI自动化测试时遇到的一个常见问题:在模拟登录163邮箱的过程中,元素定位失败,原因是没有正确地定位到iframe内的元素。文章通过分析问题原因、提供解决方案和附录代码,指导读者如何避免类似的错误,并强调了在UI自动化测试中准确定位页面元素的重要性。
38 1
|
5月前
python+Pycharm+selenium操作浏览器(Chorme或Edge)
python+Pycharm+selenium操作浏览器(Chorme或Edge)
148 1
|
5月前
|
数据采集 Web App开发 前端开发
Selenium:自动化Web浏览器操作的强大工具
**Selenium** 是一款用于自动化Web应用测试和模拟用户行为的工具,支持多种浏览器和编程语言。安装包括安装Selenium库和对应浏览器的WebDriver。基本用法包括导入库、启动浏览器、查找与操作页面元素、等待元素加载及关闭浏览器。在实际项目中,Selenium常用于Web测试、爬虫、自动化表单填写等,优点是跨平台、模拟真实用户行为,但性能较低且依赖浏览器。
214 9
|
6月前
|
JavaScript 前端开发 Java
《手把手教你》系列技巧篇(四十九)-java+ selenium自动化测试-隐藏元素定位与操作(详解教程)
【5月更文挑战第13天】本文主要讨论了在Selenium自动化测试中如何处理前端隐藏元素的问题。隐藏元素通常是通过`type="hidden"`或`style="display: none;"`属性实现的,它们在页面上不可见,但仍然存在于HTML代码中。Selenium可以定位到这些隐藏元素,但无法直接进行点击、输入等操作,会报错“ElementNotInteractableException”。
109 3
|
6月前
|
JavaScript 前端开发 测试技术
《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
【5月更文挑战第12天】本文介绍了WebDriver中用于判断元素状态的三个方法:`isEnabled()`、`isSelected()`和`isDisplayed()`。`isSelected()`检查元素是否被选中,通常用于勾选框。`isDisplayed()`则用来判断元素是否在页面上可见。`isEnabled()`方法确定元素是否可操作,例如是否能点击或输入内容。
119 1
|
6月前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)
【5月更文挑战第5天】本文介绍了HTML中的`iframe`标签,它用于在网页中嵌套其他网页。`iframe`常用于加载外部内容或网站的某个部分,以实现页面美观。文章还讲述了使用Selenium自动化测试时如何处理`iframe`,通过`switchTo().frame()`方法进入`iframe`,完成相应操作,然后使用`switchTo().defaultContent()`返回主窗口。此外,文章提供了一个包含`iframe`的HTML代码示例,并给出了一个简单的自动化测试代码实战,演示了如何在`iframe`中输入文本。
63 3