WebUI自动化测试中隐藏的元素如何操作?三种元素等待方式如何理解?

简介: WebUI自动化测试中隐藏的元素如何操作?三种元素等待方式如何理解?

1 自动化测试中隐藏的元素如何操作?

面试中,我们经常会遇到“隐藏元素是如何操作的?”带着这个问题我们看下如何操作?

1.1 实现方法

  • 针对隐藏因素的操作,常用的操作是通过JS脚本定位到该元素,获取对应的元素对象,再通过removeAttributesetAttribute两个方法完成属性的删除或重新复制操作,使得当前元素处于显示状态即可。

1.2 实现案例

  • 以下是自定义的一个HTML页面,该页面是一个登陆页面,其中用户名和登陆按钮都是隐藏的,如下:
<html>
<body>
    用户名:<input id="user_name" name="username" type="hidden" /><br>
    密码:<input id="pass_word" name="password" type="text" /><br>
    <button type="button" name="login" class="login_but" style="display:none;" />
</body>
</html>

1.3 实现思路

#主要是使用JS脚本改变标签的属性值
hi_name = "document.getElementByID('user_name').setAttribute('type', 'text')"
print(driver.execute_script(hi_name ))

driver.find_element_by_id('user_name').send_keys("admin")
print(driver.find_element_by_name("login"))

driver.execute_script("document.getElementsClassName('login_but')[0].removeAttribute('style')")

2 三种元素等待方式如何理解?

在自动化测试中,会遇到一些比如环境不稳定、网络不稳定的因素,此时可能需要控制脚本执行速度,那么就需要用到元素等待操作。其实不一定设置等待就好,各有利弊,以下是一些观点仅供参考。

2.1 强制等待

  • 方法:
time.sleep(s)
# s表示具体时间,单位为秒。
  • 含义:表示等待s秒后,进行下一步操作。直接使用python内置的time模块调用sleep方法即可。
  • 说明:强制等待又称强制休眠。作用域为当前脚本。没过多行代码需要进行等待设置,那每行代码都需要进行相同的设置操作。
  • 优缺点:
优缺点 说明
优点 使用简单,需要用时随时调用即可
缺点 代码重复率高,且影响代码执行速率。不能精确设置等待时间,过长过段貌似都不合适
  • 示例:
from selenium import webdriver
import time

driver = webdriver.Chrome()
driver.get("http://localhost/zentao/user-login.html")

user_name = "$('input:first').val('admin')"
driver.execute_script(user_name)
time.sleep(0.5)

pass_wd = "$(':password').val('ZenTao123456')"
driver.execute_script(pass_wd)
time.sleep(1)

2.2 隐式等待

  • 方法:
driver.implicitly_wait(s)
# s表示具体时间,单位为秒。
  • 含义:在s时间内,页面加载完成,进行下一步操作,直接通过浏览器驱动对象进行调用。
  • 说明:隐式等待也称智能等待,也称全局等待。表示整个页面中的所有元素加载完才会执行,会根据内部设置的频率不断刷新页面继续加载并检测当前所执行的元素是否加载完成。

如果在设定的时间之前元素加载完成,则不会继续等待,继续执行下一步。

  • 优缺点:
优缺点 说明
优点 对整个脚本的生命周期都起作用,只需要设置一次
缺点 程序会一直等待加载完成,才会执行下一步,但有时想要的元素加载完了,其他的元素没有加载完,仍要等待全部加载完才进行下一步,不是很灵活,也有点费时间。
  • 示例:
from selenium import webdriver

driver = webdriver.Chrome()
driver.get("http://localhost/zentao/user-login.html")
driver.implicitly_wait(10)

user_name = "$('input:first').val('admin')"
driver.execute_script(user_name)

pass_wd = "$(':password').val('ZenTao123456')"
driver.execute_script(pass_wd)

2.3 显式等待

  • 方法:
# 导入包
from selenium.webdriver.support.wait import 
# 或者
from selenium.webdriver.support.ui import WebDriverWait
  • 部分源码如下:
lass WebDriverWait(object):
    def __init__(self, driver, timeout, poll_frequency=POLL_FREQUENCY, ignored_exceptions=None):
        """Constructor, takes a WebDriver instance and timeout in seconds.

           :Args:
            - driver - Instance of WebDriver (Ie, Firefox, Chrome or Remote)
            - timeout - Number of seconds before timing out
            - poll_frequency - sleep interval between calls
              By default, it is 0.5 second.
            - ignored_exceptions - iterable structure of exception classes ignored during calls.
              By default, it contains NoSuchElementException only.

           Example:
            from selenium.webdriver.support.ui import WebDriverWait \n
  • 参数说明:
参数 说明
driver 驱动器对象
timeout 设置刷新页面的超时时间
poll_frequency 页面刷新频率。默认0.5s
ignored_exceptions 表示忽略异常,如无法找到元素则抛出NoSuchElementException异常
  • WebDriverWait模块有两个方法untiluntil_not
    def until(self, method, message=''):
        """Calls the method provided with the driver as an argument until the \
        return value is not False."""
        screen = None
        stacktrace = None

        end_time = time.time() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if value:
                    return value
            except self._ignored_exceptions as exc:
                screen = getattr(exc, 'screen', None)
                stacktrace = getattr(exc, 'stacktrace', None)
            time.sleep(self._poll)
            if time.time() > end_time:
                break
        raise TimeoutException(message, screen, stacktrace)
    def until_not(self, method, message=''):
        """Calls the method provided with the driver as an argument until the \
        return value is False."""
        end_time = time.time() + self._timeout
        while True:
            try:
                value = method(self._driver)
                if not value:
                    return value
            except self._ignored_exceptions:
                return True
            time.sleep(self._poll)
            if time.time() > end_time:
                break
        raise TimeoutException(message)

其中:
1、method:传入对象分两种,一种是匿名函数;另一种是预置条件对象expected_conditions。
2、message:当出现异常时,把异常信息给message;
3、expected_conditions方法通过from selenium.webdriver.support import expected_conditions引入。

  • 含义:对单个元素设置一定的频率,使其按频率刷新当前页面并检测是都存在该元素。

WebDriverWait常用的几个方法如下:

2.3.1 判断元素是否被加入DOM树中,不可见

  • 判断元素是否被加入DOM树中,并不代表元素可见,如果定位到就返回元素;
get_ele = WebDriverWait(driver,10).until(expected_conditions.\
presence_of_element_located(By.ID, "xxx"))

2.3.2 判断元素是否被加入到DOM中,并可见

  • 判断元素是否被加入到DOM中,并可见,代表元素可显示,宽和高都大于0;
get_ele1 = WebDriverWait(driver,10).until(expected_conditions.visibility_of_elemen\
t_located((by=By.ID,value='yyy')))

2.3.3 判断元素是否可见

  • 判断元素是否可见,可见返回该元素;
get_ele2 = WebDriverWait(driver,10).until(expected_conditions.visibility_of(driver\
.find_element(by=By.ID,value='zzz')))

2.3.4 判断是否至少有1个元素存在DOM树中

  • 判断是否至少有1个元素存在DOM树中,如果定位到就返回列表:
get_ele3 = WebDriverWait(driver,10).until(expected_conditions.presence_of_all_elem\
ents_located(By.CSS_SELECTOR,'.boss')))

2.3.5 判断指定的元素的属性值中是否包含了预期的字符串

  • 判断指定的元素的属性值中是否包含了预期的字符串,返回布尔值;
get_ele4 = WebDriverWait(driver,10).until(expected_conditions.text_to_be_present_i\
n_element_value(By.CSS_SELECTOR,'#su'))

2.3.6 判断指定的元素中是否包含了预期的字符串

  • 判断指定的元素中是否包含了预期的字符串,返回布尔值;
get_ele5= WebDriverWait(driver,10).until(expected_conditions.text_to_be_present_i\
n_element(By.XPATH,"//#[@id='ul']", u'添加'))

2.3.7 判断元素是否存在DOM中或不可见

  • 判断元素是否存在DOM中或不可见,如果可见,返回False,否则返回这个元素;
get_ele6= WebDriverWait(driver,10).until(expected_conditions.invisibility_of_elem\
ent_located(By.CSS_SELECTOR,'#su'))

2.3.8 判断元素是否可见且状态为enable

  • 判断元素是否可见且状态为enable(代表可点击);
get_ele7= WebDriverWait(driver,10).until(expected_conditions.element_to_be_clicka\
ble(By.CSS_SELECTOR,'#su')).click()
目录
相关文章
|
2天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(二十九)-java+ selenium自动化测试- Actions的相关操作上篇(详解教程)
【4月更文挑战第21天】本文介绍了Selenium中处理特殊测试场景的方法,如鼠标悬停。Selenium的Actions类提供了鼠标悬停功能,用于模拟用户在网页元素上的悬停行为。文中通过实例展示了如何使用Actions悬停并展开下拉菜单,以及在搜索时选择自动补全的字段。代码示例包括了打开百度首页,悬停在“更多”元素上显示下拉菜单并点击“音乐”,以及在搜索框输入关键词并自动补全的过程。
41 0
|
2天前
|
Java 测试技术 Python
《手把手教你》系列技巧篇(三十六)-java+ selenium自动化测试-单选和多选按钮操作-番外篇(详解教程)
【4月更文挑战第28天】本文简要介绍了自动化测试的实战应用,通过一个在线问卷调查(&lt;https://www.sojump.com/m/2792226.aspx/&gt;)为例,展示了如何遍历并点击问卷中的选项。测试思路包括找到单选和多选按钮的共性以定位元素,然后使用for循环进行点击操作。代码设计方面,提供了Java+Selenium的示例代码,通过WebDriver实现自动答题。运行代码后,可以看到控制台输出和浏览器的相应动作。文章最后做了简单的小结,强调了本次实践是对之前单选多选操作的巩固。
25 0
|
2天前
|
测试技术 数据安全/隐私保护 Python
【如何学习Python自动化测试】—— 鼠标键盘操作
【如何学习Python自动化测试】—— 鼠标键盘操作
4 0
|
2天前
|
编解码 测试技术 Python
【如何学习Python自动化测试】—— 浏览器操作
【如何学习Python自动化测试】—— 浏览器操作
3 0
|
2天前
|
JavaScript 测试技术 Python
【如何学习Python自动化测试】—— 时间等待
【如何学习Python自动化测试】—— 时间等待
5 1
|
2天前
|
存储 前端开发 测试技术
《手把手教你》系列技巧篇(三十五)-java+ selenium自动化测试-单选和多选按钮操作-下篇(详解教程)
【4月更文挑战第27天】本文介绍了使用Java+Selenium进行Web自动化测试时,如何遍历和操作多选按钮的方法。文章分为两个部分,首先是一个本地HTML页面的示例,展示了多选按钮的HTML代码和页面效果,并详细解释了遍历多选按钮的思路:找到所有多选按钮的共同点,通过定位这些元素并放入list容器中,然后使用for循环遍历并操作。 第二部分介绍了在JQueryUI网站上的实战,给出了被测网址,展示了代码设计,同样使用了findElements()方法获取所有多选按钮并存储到list中,然后遍历并进行点击操作。最后,文章对整个过程进行了小结,并推荐了作者的其他自动化测试教程资源。
21 0
|
2天前
|
前端开发 测试技术 Python
《手把手教你》系列技巧篇(三十三)-java+ selenium自动化测试-单选和多选按钮操作-上篇(详解教程)
【4月更文挑战第25天】本文介绍了自动化测试中如何处理单选和多选按钮的操作,包括它们的定义、HTML代码示例以及如何判断和操作这些元素。文章通过一个简单的HTML页面展示了单选和多选框的示例,并提供了Java+Selenium实现的代码示例,演示了如何检查单选框是否选中以及如何进行全选操作。
23 0
|
2天前
|
数据采集 前端开发 测试技术
《手把手教你》系列技巧篇(三十一)-java+ selenium自动化测试- Actions的相关操作-番外篇(详解教程)
【4月更文挑战第23天】本文介绍了网页中的滑动验证码的实现原理和自动化测试方法。作者首先提到了网站的反爬虫机制,并表示在本地创建一个没有该机制的网页,然后使用谷歌浏览器进行验证。接着,文章详细讲解了如何使用WebElement的click()方法以及Action类提供的API来模拟鼠标的各种操作,如右击、双击、悬停和拖动。
14 2
|
2天前
|
Web App开发 数据采集 Java
《手把手教你》系列技巧篇(三十)-java+ selenium自动化测试- Actions的相关操作下篇(详解教程)
【4月更文挑战第22天】本文介绍了在测试过程中可能会用到的两个功能:Actions类中的拖拽操作和划取字段操作。拖拽操作包括基本讲解、项目实战、代码设计和参考代码,涉及到鼠标按住元素并将其拖动到另一个元素上或指定位置。划取字段操作则介绍了如何在一段文字中随机选取一部分,包括项目实战、代码设计和参考代码。此外,文章还提到了滑动验证的实现,并提供了相关的代码示例。
41 2
|
2天前
|
Web App开发 Java 测试技术
《手把手教你》系列技巧篇(二十六)-java+ selenium自动化测试-浏览器操作(详细教程)
【4月更文挑战第18天】本文介绍了Web自动化中的浏览器操作,包括如何打开不同类型的浏览器(如IE、Chrome、Firefox),以及进行页面操作如打开URL、浏览器最大化、刷新、前进和后退。还展示了如何设置浏览器位置和大小,以及获取当前URL和标题。此外,提供了项目实战例子,演示了如何用Selenium实现打开浏览器、设置位置和大小、搜索并执行页面操作的过程。文章最后提到一些其他可用的方法,并鼓励读者继续学习自动化测试相关知识。
49 3

热门文章

最新文章