判断元素16种方法expected_conditions

时间:2023-01-03 20:07:30

前言

标签(空格分隔): 判断元素


经常有小伙伴问,如何判断一个元素是否存在,如何判断alert弹窗出来了,如何判断动态的元素等等一系列的判断,在selenium的expected_conditions模块收集了一系列的场景判断方法,这些方法是逢面试必考的!!!

  • expected_conditions 一般也简称为EC,本篇先介绍下有哪些功能;

一、功能介绍和翻译:

  • 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树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
  • 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

判断元素16种方法expected_conditions

判断title的方法:title_is

1.获取title。我们可以通过:driver.title获取,然后也可以把获取的结果用作断言

2.这里介绍另外一种方法,主要是判断页面title与期望的结果是否一样,这里就用到了:expected_conditions模块里的title_is和title_contains两种方法:

一、源码分析

1.首先看下源码,如下

class title_is(object):
"""An expectation for checking the title of a page.
title is the expected title, which must be an exact match
returns True if the title matches, false otherwise."""
'''翻译:检查页面的title与期望值是都完全一致,如果完全一致,返回Ture,否则返回Flase'''
def __init__(self, title):
self.title = title
def __call__(self, driver):
return self.title == driver.title

2.注释翻译:检查页面的title与期望值是都完全一致,如果完全一致,返回True,否则返回Flase

3.title_is()这个是一个class类型,里面有两个方法

4.__init__是初始化内容,参数是title,必填项

5.__call__是把实例变成一个对象,参数是driver,返回的是self.title == driver.title,布尔值

二、判断title:tile_is()

1.首先导入expected_conditions模块

2.由于这个模块名字比较长,为了方便调用我们重名了EC

3.打开博客页面判断title,返回结果:是布尔值

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.cnblogs.com/surewing")
title = EC.title_is(u"cherry小樱桃 - 博客")
print(title(driver))

三、判断title包含:title_contains

1.这个类跟上面那个类差不多,只是这个是部分匹配(类似于xpath里面的contains语法)

2.判断title包含'小樱桃'字符串

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("http://www.cnblogs.com/surewing")
title = EC.title_contains(u"小樱桃")
print(title(driver))

判断文本text_to_be_present_in_element

在做结果判断的时候,经常想判断某个元素中是否存在指定的文本,如登录后判断页面中是账号是否是该用户的用户名。

在前面的登录案例中,写了一个简单的方法,但不是公用的,在EC模块有个方法是可以专门用来判断元素中存在指定文本的:text_to_be_present_in_element。

另外一个差不多复方法判断元素的value值:text_to_be_present_in_element_value。

二、判断文本

1.判断百度首页上,“用户名”按钮这个元素中存在文本:用户名

判断元素16种方法expected_conditions

2.locator参数是定位方法

3.text是期望值

#coding:utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
driver =webdriver.Chrome()
url="http://www.baidu.com"
driver.get(url)
locator =("id","s_username_top")
text =u"哦啊啊4yv7"
result = EC.text_to_be_present_in_element_value(locator,text)(driver)
print(result)

三、失败的案例:

1.如果判断失败,就返回False

locator =("id","s_username_top")
text=u"哦啊啊4yv7"
result = EC.text_to_be_present_in_element(locator,text)(driver)
print(result)
text1 =u"kkkk"
result = EC.text_to_be_present_in_element_value(locator,text1)(driver)
print(result1)

判断弹框出现alert_is_present

系统弹框我们会经常见到,有时候他不弹出来去操作的话,会有异常现象产生,那么又不知道他什么时候出现,那么就需要去判断弹框是否出现了。

二、实例操作

1.前面的操作步骤优化了下,为了提高脚本的稳定性,确保元素出现后操作,这里结合WebDriverWait里的方法

2.实现步骤如下,这里判断的结果返回有两种:没找到就返回False;找到就返回alert对象

3.先判断alert是否弹出,如果弹出就点确定按钮accept()

mouse = webDriverWait(driver,10).until(lambda x:x.find_element("link text","设置"))
ActionChains(driver).move_to_element(mouse).perform()
webDriverWait(driver,10).until(lambda x:x.find_element("link text","搜索设置")).click()
#选择设置项
s=WebDriverWait(driver,10).until(lambda x:x.find_element('id','nr'))
Select(s).select_by_visible_text("每页显示50条")
#点击保存按钮
js ="document.getElemensByClassName('prefpanelgo')[0].click();"
driver.execute_script(js)
result = EC.alert_is_present()(driver)
if result:
print(result.text)
result.accept()
else:
print("alert 未弹出")

封装:

我们学了显示等待后,就不需要sleep了,然后查找元素方法用参数化去定位,这样定位方法更灵活了,但是这样写起来代码会很长了,于是问题来了,总不能每次定位一个元素都要写一大堆代码吧?这时候就要学会封装啦!

一、显示等待

1.如果你的定位元素代码,还是这样:driver.find_element_by_id("kw").send_keys("百度"),那说明你还停留在小学水平,如何让代码提升逼格呢?

2.前面讲过显示等待相对于sleep来说更省时间,定位元素更靠谱,不会出现一会正常运行,一会又报错的情况,所以我们的定位需与WebDriverWait结合

3.以百度的搜索为例

# coding:utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.ui import webDriverWait driver =webdriver.Chrome()
driver.get("http://www.baidu.com")
#输入搜索的内容
input_loc = ("id","kw")
WebDriverWait(driver,10).until(lambda x:x.find_element(*input_loc)).send_keys("bbb")
#点击搜索按钮
button_loc = ("id","su")
WebDriverWait(driver,10).until(lambda x:x.find_element(*input_loc)).click()

二、封装定位方法

1.从上面代码看太长了,每次定位写一大串,这样不方便阅读,写代码的效率也低,于是我们可以把定位方法进行封装

2.定位方法封装后,我们每次调用自己写的方法就方便多了

判断元素16种方法expected_conditions

判断元素16种方法expected_conditions的更多相关文章

  1. JavaScript数据类型判断的四种方法

    码文不易啊,转载请带上本文链接呀,感谢感谢 https://www.cnblogs.com/echoyya/p/14416375.html 本文分享了JavaScript类型判断的四种方法:typeo ...

  2. jQuery判断元素是否存在方法总结

    在jquery中判断元素是否存在我们可使用$("#div").length > 0)来判断了,意思就是判断元素长度了,如果没有肯定是不存在的哦,下面我来介绍介绍. 使用传统j ...

  3. Js中数据类型判断的几种方法

    判断js中的数据类型有一下几种方法:typeof.instanceof. constructor. prototype. $.type()/jquery.type(),接下来主要比较一下这几种方法的异 ...

  4. Selenium webdriver定位iframe里面元素两种方法

    以东方财富网登录页面为例: 在查找元素过程中,直接通过id或者xpath等找不到元素,查看页面源代码发现元素是属于iframe里,例如: <div class="wrap_login& ...

  5. web页面中快速找到html对应元素两种方法

    一.第一种方法(通过先进入开发模式然后再去选择网页元素) 1.打开IE.Chrome.FireFox等,按 F12 键进入开发模式 2.在打开的控制窗口左上角有个  箭头 按钮,点击它之后,此时将鼠标 ...

  6. JS数据类型判断的几种方法

    JS数据类型判断 JavaScript 中常见数据类型有Number.String.Boolean.Object.Array.Json.Function.Date.RegExp.Error.undef ...

  7. jQuery判断元素是否存在方法

    1.使用javascript判断元素是否存在 if(document.getElementById('div')) { } else { } 2.使用jquery判断元素是否存在 if ($(&quo ...

  8. expected&lowbar;conditions模块提供了判断页面元素的16种方法

    1.title_is: 判断当前页面的title是否完全等于(==)预期字符串,返回布尔值2.title_contains : 判断当前页面的title是否包含预期字符串,返回布尔值3.presenc ...

  9. 判断元素的16中方法expected&lowbar;conditions

    from selenium.webdriver.support import expected_conditons as EC 1.title_is:判断当前页面的title是否完全等于预期字符串,返 ...

随机推荐

  1. webform简单、复合控件

    简单控件: 1.Label 会被编译成span标签 属性: Text:文本内容 CssClass:CSS样式 Enlabled:是否可用 Visible:是否可见 2.Literal 空的,C#会把里 ...

  2. React Native环境配置和简单使用

    # 前言 学习本系列内容需要具备一定 HTML 开发基础,没有基础的朋友可以先转至 HTML快速入门(一) 学习 本人接触 React Native 时间并不是特别长,所以对其中的内容和性质了解可能会 ...

  3. PHP 的 &lowbar;&lowbar;FILE&lowbar;&lowbar; 常量

    今天碰到了PHP的常量__FILE__的问题了. 在网上查了一下.总结了以下规律. dirname(__FILE___) 函数返回的是脚本所在在的路径. 比如文件 b.php 包含如下内容: < ...

  4. Sharepoint学习笔记—习题系列--70-576习题解析 -&lpar;Q52-Q55&rpar;

    Question 52You are responsible for rebranding the My Sites section of a corporate SharePoint 2010 fa ...

  5. 曾经post为何只能通过form来提交

    当我们web程序的前台,需要有数据向后台发送时候,我们第一时间想到的就是,给我们所需要提交的用户名,密码之类的数据封装到一个<form>表单里面去,而封装完毕之后,我们需要给form的提交 ...

  6. Hadoop基础

    Hadoop组成 包括两个核心组成:HDFS:分布式文件系统,存储海量的数据MapReduce:并行处理框架,实现任务分解和调度 搭建大型数据仓库,PB级数据的存储.处理.分析.统计等业务(搜索引擎. ...

  7. Paint获取Text的宽和高的数据

    获取字符串的宽度: public static float GetTextWidth(String text, float Size) { // 第一个参数是要计算的字符串,第二个参数是字提大小 Te ...

  8. 关于SEO的一些浅认识

    SEO的浅认识 定义描述:在百度百科上它是这样描述的--------SEO是指在了解搜索引擎自然排名机制的基础之上,对网站进行内部及外部的调整优化,改进网站在搜索引擎中关键词的自然排名,获得更多的展现 ...

  9. Python数据结构之单链表

    Python数据结构之单链表 单链表有后继结点,无前继结点. 以下实现: 创建单链表 打印单链表 获取单链表的长度 判断单链表是否为空 在单链表后插入数据 获取单链表指定位置的数据 获取单链表指定元素 ...

  10. python异步编程模块asyncio学习&lpar;二&rpar;

    尽管asyncio应用通常作为单线程运行,不过仍被构建为并发应用.由于I/O以及其他外部事件的延迟和中断,每个协程或任务可能按一种不可预知的顺序执行.为了支持安全的并发执行,asyncio包含了thr ...