• 0
  • 0
分享

一、元素等待

大多数的 web 应用程序都是使用 ajax 和 javascript 开发的,加载时都有加载顺序,可能打开了网页但是元素并未加载出来,这个时候就定位不到元素了,就会报错。所以,我们需要等到元素被加载出来后再去进行定位等操作。

1.1 强制等待

如果元素已经出现还是要继续等待,直到超时,会浪费很多的时间,不建议使用。

import time
time.sleep(5)  # 固定休眠5秒

1.2 隐式等待

创建driver时,为浏览器对象创建一个等待时间,整个 driver 的会话周期内设置一次即可。需要等待整个页面加载完成才会行下一步,可能页面加载未完成的时候,需要定位的元素已经加载完成了,但因为某些JS文件、图片未加载完成,不能执行下一步,增加了不必要的等待时间。

from selenium import webdriver
driver = webdriver.Chrome()
driver.get("http://localhost:63342/webtest/demo.html")
driver.implicitly_wait(10)
driver.quit()

1.3 显示等待

显示等待只对某个元素生效,无需等待页面加载完成,节省了加载时间。

等到某个条件满足后,再执行操作(程序每隔 x 秒查询一次,若条件成立则执行下一步,否则继续等待,超过设置的最长时间条件仍不成立则抛出 TimeoutException)

WebDriverWait 显示等待类:WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None):

  • driver:浏览器驱动

  • timeout:最长超时时间,默认以秒为单位

  • poll_frequency:检测的间隔(步长)时间,默认为0.5S

  • ignored_exceptions:超时后的异常信息,默认情况下抛NoSuchElementException异常

WebDriverWait 一般和 until()、until_not() 方法配合使用:

  • until:直到条件成立

  • until_not:直到条件不成立

expected_condition 模块提供了希望发生的条件,如 presence_of_element_located 元素存在、visibility_of_element_located 元素可见、element_to_be_clickable 元素可点击,常用操作如下:

expected_condition

方法说明
title_is判断当前页面的 title 是否完全等于(==)预期字符串,返回布尔值
title_contains判断当前页面的 title 是否包含预期字符串,返回布尔值
presence_of_element_located判断某个元素是否被加到了 dom 树里,并不代表该元素一定可见
visibility_of_element_located判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于 0
visibility_of跟上面的方法做一样的事情,只是上面的方法要传入 locator,这个方法直接传定位到的 element 就好了
presence_of_all_elements_located判断是否至少有 1 个元素存在于 dom 树中
text_to_be_present_in_element判断某个元素中的 text 是否 包含 了预期的字符串
text_to_be_present_in_element_value判断某个元素中的 value 属性是否包含 了预期的字符串
frame_to_be_available_and_switch_to_it判断该 frame 是否可以 switch进去,如果可以的话,返回 True 并且 switch 进去,否则返回 False
invisibility_of_element_located判断某个元素中是否不存在于dom树或不可见
element_to_be_clickable判断某个元素中是否可见并且是 enable 的,这样的话才叫 clickable
staleness_of等某个元素从 dom 树中移除,注意,这个方法也是返回 True或 False
element_to_be_selected判断某个元素是否被选中了,一般用在下拉列表
element_selection_state_to_be判断某个元素的选中状态是否符合预期
element_located_selection_state_to_be跟上面的方法作用一样,只是上面的方法传入定位到的 element,而这个方法传入 locator
alert_is_present判断页面上是否存在 alert

示例代码:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
driver.find_element(By.ID, "kw").send_keys("test")

 二、元素基本操作

2.1 点击

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
ele = driver.find_element(By.ID, "kw").send_keys("test")
# 点击
driver.find_element(By.ID, "su").click()
driver.quit()

2.2 输入/清空文本

from time import sleep
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
WebDriverWait(driver, 5, 0.5).until(EC.presence_of_element_located((By.ID, "kw")))
ele = driver.find_element(By.ID, "kw")
# 输入文本
ele.send_keys("test")
sleep(1)
# 清空输入框文本
ele.clear()
driver.quit()

2.3 获取元素尺寸、坐标

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
ele = driver.find_element(By.LINK_TEXT, "新闻")
print(ele.size) # 获取元素宽高
print(ele.location) # 获取元素x,y坐标值
print(ele.rect) # 获取元素宽高、xy坐标值
driver.quit()

2.4 获取元素标签文本

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
ele = driver.find_element(By.LINK_TEXT, "新闻")
# 获取元素 text 属性
print(ele.text)
driver.quit()

2.5 获取元素属性

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get('http://www.baidu.com')
ele = driver.find_element(By.LINK_TEXT, "新闻")
print(ele.get_attribute("href"))
ele = driver.find_element_by_tag_name("html")
#  获取元素标签的内容
# print(ele.get_attribute('textContent'))
# # 获取元素内的全部HTML
# print(ele.get_attribute('innerHTML'))
# 获取包含选中元素的HTML
print(ele.get_attribute('outerHTML'))
driver.quit()

2.6 检查元素是否可见、可点击等

ele.is_displayed()
ele.is_enabled()
ele.is_selected()

2.7 获取元素标签类型

ele.tag_name

2.8 表单提交

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
ele = driver.find_element_by_id('kw')
ele.send_keys('test')
ele.submit()    # 提交表单,可以模拟在搜索框输入文字后回车的操作
driver.quit()

2.9 指定元素截图

from selenium import webdriver
from selenium.webdriver.common.by import By
driver = webdriver.Chrome()
driver.get("https://www.baidu.com")
ele = driver.find_element_by_link_text("新闻")
ele.screenshot("test.png")  # 截图
driver.quit()


作者:芒果日记

原文链接:https://www.cnblogs.com/sharef/p/13633628.html

  • 【留下美好印记】
    赞赏支持
登录 后发表评论
+ 关注

热门文章

    最新讲堂

      • 推荐阅读
      • 换一换
          • 金三银四马上来了,又是一波离职高峰,很多小伙伴已经开始投身跳槽的准备中了。大家选择跳槽无非是想增加自己的工资收入,所以面试过程中的谈薪环节就显得尤为重要,谈的好与不好,未来整个的薪资水平都可能受影响。那面试中,当问到“你的期望薪资是多少?“应该如何回答呢?作为一名软件测试资深面试官,站在求职者角度,从以下3个方面聊一聊:了解市场薪资行情清楚薪酬结构面试如何谈薪1、了解市场薪资水平案例: 小柠,工作2年,上家薪资是8000,跳槽后9500,跟身边朋友和前同事相比,个人很满意。 结果入职后发现,比自己晚入职技能也不如自己的新同事,薪资却过万,顿时心里不舒服了。一般来说,跳槽涨薪可达10%-30%,...
            13 13 2924
            分享
          •   KYM  KYM是Kown Your Mission的简称,顾名思义,就是帮助用例设计人员梳理测试任务的过程,它是一种系统的收集和整理测试启发的框架。  在接触一些新事物或者面对一些新问题时,人们往往更关注问题本身,也就是what,而忽略了问题产生的原因(why)和途径(how),就像用例设计人员做设计时上来就直接写用例,即使是有丰富经验的测试大佬,也难免在直接写用例时遗漏一些测试点。  因此作为测试人员更应该具备why=>how=>what=>when=>who的测试思路来更加深入地了解测试对象。  KYM模型在实际用例设计过程中从用户、项目/产品、任务三个维度对...
            0 0 1396
            分享
          • 读者提问:如何做 APP 更新测试 ?阿常回答:这个问题我分别从 1、更新方式;2、测试点 这两点来回答。昨天阿常和大家分享了 APP 的安装测试,卸载功能因为是系统做的,而不是应用实现的,所以不需要做特别的测试。今天我们继续聊聊 APP 的更新测试。一、APP 的几种更新方式一)全量更新1、应用内检查版本更新。2、第三方应用商店更新。二)热更新发布补丁方式的更新,一般热更新用于紧急修复 BUG。二、APP 更新测试测试点一)强制更新1、强制更新的提示信息是否正确、完整。2、强制更新的提示弹窗能否被关掉。3、点击确定更新按钮,是否能更新成功。4、强制更新...
            0 0 2062
            分享
          •   在JMeter中,有一些内置的变量,可以帮助我们在测试过程中存储和使用一些数据。这些内置变量有四种:vars,props,prev和sample。  vars变量  vars变量是JMeterVariables类的一个实例,它是一个Map类型的对象,可以存储String或Object类型的数据。vars变量的作用域是当前线程组,也就是说,只有同一个线程组内的线程才能访问和修改同一个vars变量。如果不同的线程组需要共享数据,就不能使用vars变量。  vars变量的使用方法很简单,我们可以在BeanShell Sampler或JSR223 Sampler中使用以下语法来获取和设置vars变...
            0 0 661
            分享
          •    初次接触批量测试的小伙伴一定一头雾水,不知从何下手。批量交易是什么?它与联机交易有何不同?批量测试都要关注哪些内容?本文结合实际测试经验,详细介绍批量交易的概念、分类以及功能测试关注点,助力测试小伙伴迈出批量功能测试的第一步。  一、什么是批量交易?  本文所称的批量交易,是与联机交易相对应的概念。联机交易具有实时、快速响应用户请求的特点,接收和处理请求都是实时的,处理完毕后立刻将结果返回客户。批量交易则是在接收请求后,顺序处理,全部处理完毕后再将处理结果统一输出,因此具有处理数据量大,执行时间较长的特点。  一般而言,批量交易通过建立作业计划模板,以人工干预或系统自动调起程序...
            13 13 2950
            分享
      • 51testing软件测试圈微信