1.简介

webdriver有三种判断元素状态的方法,分别是isEnabled,isSelected 和 isDisplayed,其中isSelected在前面的内容中已经简单的介绍了,isSelected表示查看元素是否被选中,一般用在勾选框中(多选或者单选),isDisplayed表示查看选中是否可见。isEnabled表示查什么呢?isEnabled表示查看元素是否可以进行操作,比如,点击,输入等。

2.isEnabled()源码

/**
* Is the element currently enabled or not? This will generally return true for everything but
* disabled input elements.
* <p>
* See <a href="https://w3c.github.io/webdriver/#is-element-enabled">W3C WebDriver specification</a>
* for more details.
*
* @return True if the element is enabled, false otherwise.
*/
boolean isEnabled();

从上边的源码中的注释可以看出isEnabled()方法是用来判断页面元素是否可操作。可操作返回true,不可操作返回false。

3.isEnabled()用法

List<WebElement> targetElement =  driver.findElements(By.xpath("xpath_your_expected_element"));

    try {

        if(targetElement>=1) {

            if(targetElement.isEnabled()) {

                System.out.println("Element is operable");

            }else {

                System.out.println("Element is found, but hidden on the page");

            }

        }else {

            System.out.println("Element not found on the page");

        }
}catch (NoSuchElementException e) { System.out.println("Exception in finding the element:" + e.getMessage()); }

4.项目实战

宏哥这里用度娘的首页搜索输入框举例,判断这个搜索输入框是否可以输入内容,然后利用JavaScript加上属性readonly后,再次判断是否可以输入内容,对你没看错就是这么玩。

4.1测试用例(思路)

1.访问度娘首页

2.定位搜索输入框,判断其是否可以操作(输入搜索内容)

3.给搜索输入框通过JavaScript添加readonly属性

4.再次判断搜索输入框是否可以操作(输入搜索内容)

4.2代码设计

4.3参考代码

package lessons;

import java.util.concurrent.TimeUnit;

import org.openqa.selenium.By;
import org.openqa.selenium.JavascriptExecutor;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author: 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
*
* 2021年11月20日
*/
public class testEnabled { public static void main(String[] args) throws Exception { System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe"); WebDriver driver = new ChromeDriver(); driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//访问度娘首页
driver.get("https://www.baidu.com/"); WebElement searchInputBox = driver.findElement(By.id("kw"));
if(searchInputBox.isEnabled()==true){
System.out.println("百度首页的搜索输入框可以输入内容!");
}
//给搜索输入框通过JavaScript添加disable属性
JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
String js = "document.getElementById('kw').setAttribute('disabled', '')";
jsExecutor.executeScript(js);
Thread.sleep(5000);
WebElement searchInputBox1 = driver.findElement(By.className("s_ipt")); //再次判断搜索输入框是否可以操作(输入搜索内容)
if(!searchInputBox1.isEnabled()){
System.out.println("百度首页的搜索输入框不可以输入内容!");
}
driver.quit();
} }

4.4运行代码

1.运行代码,右键Run AS->Java Appliance,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作(宏哥点击输入框也不允许输入内容),如下小视频所示:

3.可能小伙伴后者童鞋们没有注意宏哥在录屏中点击输入框,通过JavaScript给输入框加入不可操作属性,宏哥在这里演示一下,仍然给输入框输入内容就会报如下错误:element not interactable(元素不可交互)。如下图所示:

4.当然了你也可以通过F12查看元素已经加上了不可以操作的属性,如下图所示:

5.小结

好了,今天时间也不早了,宏哥就分享到这里,感谢您耐心地阅读。

6.拓展

如果你不想用或者觉得selenium自带的API不能满足你的要求,你也可以根据自己的需要定义一个API,然后进行调用使用。

6.1自定义的API

//自定义一个判断页面元素是否存在的函数或者方法IsElementPresent
private boolean IsElementPresent(By by){
try{
//如果传入的参数by能够找到页面元素,则函数返回“true”,表示成功
//找到页面元素
driver.findElement(by);
return true;
}catch(NoSuchElementException e){
//如果传入的参数by没有找到页面元素,则函数返回“false”,
//表示没有成功的找到页面元素
return false;
}
}

6.2测试方法

@Test
public void testIsElement1(){ driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//访问搜狗首页
driver.get("http://www.baidu.com"); //调用ISElementPresent函数,查找ID为“query”的页面元素对象
if(IsElementPresent(By.id("kw"))){
//如果定位到页面元素,则把页面元素对象存储到searchInputBox变量中
WebElement searchInputBox = driver.findElement(By.id("kw"));
/*判断searchInputBox变量对象是否处于可用状态。如果处于可用状态,则输入
“搜狗首页的搜索输入框被成功找到!”*/
if(searchInputBox.isEnabled()==true){
searchInputBox.sendKeys("百度首页的搜索输入框被成功找到!");
}
}else{
//如果首页输入框元素未被找到。则将此测试用例的设置为失败状态
//打印失败原因
Assert.fail("页面上的输入框元素未被找到!");
}
}

6.3参考代码

package lessons;

import java.util.concurrent.TimeUnit;

import junit.framework.Assert;

import org.junit.Test;
import org.openqa.selenium.By;
import org.openqa.selenium.NoSuchElementException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver; /**
* @author: 北京-宏哥
*
* @公众号:北京宏哥
*
* 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
*
* 2021年11月20日
*/
public class testIsElement { WebDriver driver = new ChromeDriver();
//自定义一个判断页面元素是否存在的函数或者方法IsElementPresent
private boolean IsElementPresent(By by){
try{
//如果传入的参数by能够找到页面元素,则函数返回“true”,表示成功
//找到页面元素
driver.findElement(by);
return true;
}catch(NoSuchElementException e){
//如果传入的参数by没有找到页面元素,则函数返回“false”,
//表示没有成功的找到页面元素
return false;
}
} @Test
public void testIsElement1(){ driver.manage().window().maximize(); driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
//访问搜狗首页
driver.get("http://www.baidu.com"); //调用ISElementPresent函数,查找ID为“query”的页面元素对象
if(IsElementPresent(By.id("kw"))){
//如果定位到页面元素,则把页面元素对象存储到searchInputBox变量中
WebElement searchInputBox = driver.findElement(By.id("kw"));
/*判断searchInputBox变量对象是否处于可用状态。如果处于可用状态,则输入
“搜狗首页的搜索输入框被成功找到!”*/
if(searchInputBox.isEnabled()==true){
searchInputBox.sendKeys("百度首页的搜索输入框被成功找到!");
}
}else{
//如果首页输入框元素未被找到。则将此测试用例的设置为失败状态
//打印失败原因
Assert.fail("页面上的输入框元素未被找到!");
}
} }

6.4运行代码

1.运行代码,右键Run AS->Junit Test,控制台输出,如下图所示:

2.运行代码后电脑端的浏览器的动作,如下小视频所示:

《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)的更多相关文章

  1. 《手把手教你》系列技巧篇(五十)-java+ selenium自动化测试-字符串操作-上篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  2. 《手把手教你》系列技巧篇(四十一)-java+ selenium自动化测试 - 处理iframe -上篇(详解教程)

    1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...

  3. 《手把手教你》系列技巧篇(十)-java+ selenium自动化测试-元素定位大法之By class name(详细教程)

    1.简介 按宏哥计划,本文继续介绍WebDriver关于元素定位大法,这篇介绍By ClassName.看到ID,NAME这些方法的讲解,小伙伴们和童鞋们应该知道,要做好Web自动化测试,最好是需要了 ...

  4. 《手把手教你》系列技巧篇(五十一)-java+ selenium自动化测试-字符串操作-下篇(详解教程)

    1.简介 自动化测试中进行断言的时候,我们可能经常遇到的场景.从一个字符串中找出一组数字或者其中的某些关键字,而不是将这一串字符串作为结果进行断言.这个时候就需要我们对字符串进行操作,宏哥这里介绍两种 ...

  5. 《手把手教你》系列技巧篇(四十七)-java+ selenium自动化测试-判断元素是否显示(详解教程)

    1.简介 webdriver有三种判断元素状态的方法,分别是isEnabled,isSelected 和 isDisplayed,其中isSelected在前面的内容中已经简单的介绍了,isSelec ...

  6. 《手把手教你》系列技巧篇(十七)-java+ selenium自动化测试-元素定位大法之By css上卷(详细教程)

    1.简介 CSS定位方式和xpath定位方式基本相同,只是CSS定位表达式有其自己的格式.CSS定位方式拥有比xpath定位速度快,且比CSS稳定的特性.下面详细介绍CSS定位方式的使用方法.xpat ...

  7. 《手把手教你》系列技巧篇(四十二)-java+ selenium自动化测试 - 处理iframe -下篇(详解教程)

    1.简介 经过宏哥长时间的查找,终于找到了一个含有iframe的网页.所以今天这一篇的主要内容就是用这个网页的iframe,宏哥给小伙伴或者童鞋们演示一下,在处理过程中遇到的问题以及宏哥是如何解决的. ...

  8. 《手把手教你》系列技巧篇(六)-java+ selenium自动化测试-阅读selenium源码(详细教程)

    1.简介 前面几篇基础系列文章,足够你迈进了Selenium门槛,再不济你也至少知道如何写你第一个基于Java的Selenium自动化测试脚本.接下来宏哥介绍Selenium技巧篇,主要是介绍一些常用 ...

  9. 《手把手教你》系列技巧篇(九)-java+ selenium自动化测试-元素定位大法之By name(详细教程)

    1.简介 上一篇宏哥已经介绍了通过id来定位元素,今天继续介绍其他剩下的七种定位方法中的通过name来定位元素.本文来介绍Webdriver中元素定位方法之By name,顾名思义,就是我们想要定位的 ...

随机推荐

  1. 全志TinaLinux编译错误fatal error: unicode/ucnv.h: No such file or directory

    今天开始正式干活了 拿到一个全志Tina的板子还有一个SDK压缩包,要求我这周(只剩一天半...)就要把sdk编译通过并且把板子跑起来. 还特别跟我说他们试了下这个sdk编译没法通过,会报错... 竟 ...

  2. hdu 1198 Farm Irrigation(并查集)

    题意: Benny has a spacious farm land to irrigate. The farm land is a rectangle, and is divided into a ...

  3. POJ 3692 Kindergarten(二分图最大独立集)

    题意: 有G个女孩,B个男孩.女孩彼此互相认识,男孩也彼此互相认识.有M对男孩和女孩是认识的.分别是(g1,b1),.....(gm,bm). 现在老师要在这G+B个小孩中挑出一些人,条件是这些人都互 ...

  4. 从零开始搭建你的nvim ide

    前言概述 vim由于其丰富的扩展性.出色的跨平台性.高效率的操作性深受一大批粉丝的追捧,甚至就连vim和emacs之间孰优孰劣的话题都能被引起一场编辑器之间的圣战,足以见vim是多么的优秀. vim的 ...

  5. 双链路接入(双出口)isp运营商(负载分担)

    USG作为校园或大型企业出口网关可以实现内网用户通过两个运营商访问Internet,并保护内网不受网络攻击. 组网需求 某学校网络通过USG连接到Internet,校内组网情况如下: 校内用户主要分布 ...

  6. crond 任务调度

    crontab 进行定时任务的设置 任务调度:是指系统在某个时间执行的特定的命令或程序. 任务调度分类: 系统工作:有些重要的工作必须周而复始地执行.如病毒扫描等 个别用户工作:个别用户可能希望执行某 ...

  7. let that = this用法解析

    这种情况就是在一个代码片段里this有可能代表不同的对象,而编码者希望this代表最初的对象

  8. Java开发介绍之JDK JRE JVM 和 环境变量配置

    一.JDK>JRE>JVM JDK(Java Development Kit):Java开发工具包 JDK中包含JRE,在JDK的安装目录下有一个名为jre的目录,里面有两个文件夹bin和 ...

  9. python连接集群mongodb,封装增删改查

    1.下载pymongo pip install pymongo 2.直接上代码 [ini配置文件] 封装读ini省略~~ [db.py] class Database(): def __init__( ...

  10. SpringCloud升级之路2020.0.x版-33. 实现重试、断路器以及线程隔离源码

    本系列代码地址:https://github.com/JoJoTec/spring-cloud-parent 在前面两节,我们梳理了实现 Feign 断路器以及线程隔离的思路,并说明了如何优化目前的负 ...