1.简介

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

2.isEnabled()源码

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

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

3.isEnabled()用法

  1. List<WebElement> targetElement = driver.findElements(By.xpath("xpath_your_expected_element"));
  2.  
  3. try {
  4.  
  5. if(targetElement>=1) {
  6.  
  7. if(targetElement.isEnabled()) {
  8.  
  9. System.out.println("Element is operable");
  10.  
  11. }else {
  12.  
  13. System.out.println("Element is found, but hidden on the page");
  14.  
  15. }
  16.  
  17. }else {
  18.  
  19. System.out.println("Element not found on the page");
  20.  
  21. }
  22. }catch (NoSuchElementException e) {
  23.  
  24. System.out.println("Exception in finding the element:" + e.getMessage());
  25.  
  26. }

4.项目实战

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

4.1测试用例(思路)

1.访问度娘首页

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

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

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

4.2代码设计

4.3参考代码

  1. package lessons;
  2.  
  3. import java.util.concurrent.TimeUnit;
  4.  
  5. import org.openqa.selenium.By;
  6. import org.openqa.selenium.JavascriptExecutor;
  7. import org.openqa.selenium.WebDriver;
  8. import org.openqa.selenium.WebElement;
  9. import org.openqa.selenium.chrome.ChromeDriver;
  10.  
  11. /**
  12. * @author: 北京-宏哥
  13. *
  14. * @公众号:北京宏哥
  15. *
  16. * 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
  17. *
  18. * 2021年11月20日
  19. */
  20. public class testEnabled {
  21.  
  22. public static void main(String[] args) throws Exception {
  23.  
  24. System.setProperty("webdriver.chrome.driver", ".\\Tools\\chromedriver.exe");
  25.  
  26. WebDriver driver = new ChromeDriver();
  27.  
  28. driver.manage().window().maximize();
  29.  
  30. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  31. //访问度娘首页
  32. driver.get("https://www.baidu.com/");
  33.  
  34. WebElement searchInputBox = driver.findElement(By.id("kw"));
  35. if(searchInputBox.isEnabled()==true){
  36. System.out.println("百度首页的搜索输入框可以输入内容!");
  37. }
  38. //给搜索输入框通过JavaScript添加disable属性
  39. JavascriptExecutor jsExecutor = (JavascriptExecutor) driver;
  40. String js = "document.getElementById('kw').setAttribute('disabled', '')";
  41. jsExecutor.executeScript(js);
  42. Thread.sleep(5000);
  43. WebElement searchInputBox1 = driver.findElement(By.className("s_ipt"));
  44.  
  45. //再次判断搜索输入框是否可以操作(输入搜索内容)
  46. if(!searchInputBox1.isEnabled()){
  47. System.out.println("百度首页的搜索输入框不可以输入内容!");
  48. }
  49. driver.quit();
  50. }
  51.  
  52. }

4.4运行代码

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

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

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

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

5.小结

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

6.拓展

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

6.1自定义的API

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

6.2测试方法

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

6.3参考代码

  1. package lessons;
  2.  
  3. import java.util.concurrent.TimeUnit;
  4.  
  5. import junit.framework.Assert;
  6.  
  7. import org.junit.Test;
  8. import org.openqa.selenium.By;
  9. import org.openqa.selenium.NoSuchElementException;
  10. import org.openqa.selenium.WebDriver;
  11. import org.openqa.selenium.WebElement;
  12. import org.openqa.selenium.chrome.ChromeDriver;
  13.  
  14. /**
  15. * @author: 北京-宏哥
  16. *
  17. * @公众号:北京宏哥
  18. *
  19. * 《手把手教你》系列技巧篇(四十八)-java+ selenium自动化测试-判断元素是否可操作(详解教程)
  20. *
  21. * 2021年11月20日
  22. */
  23. public class testIsElement {
  24.  
  25. WebDriver driver = new ChromeDriver();
  26. //自定义一个判断页面元素是否存在的函数或者方法IsElementPresent
  27. private boolean IsElementPresent(By by){
  28. try{
  29. //如果传入的参数by能够找到页面元素,则函数返回“true”,表示成功
  30. //找到页面元素
  31. driver.findElement(by);
  32. return true;
  33. }catch(NoSuchElementException e){
  34. //如果传入的参数by没有找到页面元素,则函数返回“false”,
  35. //表示没有成功的找到页面元素
  36. return false;
  37. }
  38. }
  39.  
  40. @Test
  41. public void testIsElement1(){
  42.  
  43. driver.manage().window().maximize();
  44.  
  45. driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  46. //访问搜狗首页
  47. driver.get("http://www.baidu.com");
  48.  
  49. //调用ISElementPresent函数,查找ID为“query”的页面元素对象
  50. if(IsElementPresent(By.id("kw"))){
  51. //如果定位到页面元素,则把页面元素对象存储到searchInputBox变量中
  52. WebElement searchInputBox = driver.findElement(By.id("kw"));
  53. /*判断searchInputBox变量对象是否处于可用状态。如果处于可用状态,则输入
  54. “搜狗首页的搜索输入框被成功找到!”*/
  55. if(searchInputBox.isEnabled()==true){
  56. searchInputBox.sendKeys("百度首页的搜索输入框被成功找到!");
  57. }
  58. }else{
  59. //如果首页输入框元素未被找到。则将此测试用例的设置为失败状态
  60. //打印失败原因
  61. Assert.fail("页面上的输入框元素未被找到!");
  62. }
  63. }
  64.  
  65. }

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. #ifndef #define #endif #ifdef 避免重复引用

    一:在什么阶段处理 ? 预处理 预处理 预处理 首先注意这四个头文件保护符是在预处理阶段由系统默认的预处理器(Linux操作系统上默认是cpp)来处理的.它们的含义如下: #define XXX // ...

  2. jenkins 安装与使用

    1.jenkins下载:https://jenkins.io/zh/download/ 2.将下载好的war包放到tomcat容器下的D:\apache-tomcat-9.0.10\webapps下( ...

  3. robot_framewok自动化测试--(8)SeleniumLibrary 库(selenium、元素定位、关键字和分层设计)

    SeleniumLibrary 库 一.selenium 1.1.Selenium 介绍 Selenium 自动化测试工具,它主要是用于 Web 应用程序的自动化测试,但并不只局限于此,同时支持所有基 ...

  4. Javafx-【直方图】文本频次统计工具 中文/英文单词统计

    上周倒腾了下 javafx,本来是做平时成绩系统.跟老师提了一下 javafx,他突然兴起,发了个统计中文和英文单词并以直方图显示的实验......只给两三天的期限,笑着说考验我们的潜力SOS,于是带 ...

  5. PTA 7-1 是否完全二叉搜索树 (30分)

    PTA 7-1 是否完全二叉搜索树 (30分) 将一系列给定数字顺序插入一个初始为空的二叉搜索树(定义为左子树键值大,右子树键值小),你需要判断最后的树是否一棵完全二叉树,并且给出其层序遍历的结果. ...

  6. [python]selenium常用的操作

    浏览器 1.火狐浏览器 br = webdriver.Firefox() #最大化窗口br.maximize_window() br.get('http://baidu.com') 2.谷歌浏览器 b ...

  7. linux下端口占用

    1, netstat -tunlp|grep 1235 2,kill -9 18520

  8. Effective C++ 总结笔记(五)

    六.继承与面向对象设计 32.确定你的public继承塑模出is-a关系 public继承意味着is-a.适用于base class身上的每一件事情也一定适用于derived class身上.每一个d ...

  9. 新技能GET!在前端表格中花式使用异步函数的奥义

    背景 60年代时,操作系统中独立运行的单元通常是进程.但随着计算机技术的发展,人们发现在进程运行过程中,创建.撤销与切换都要花费较大的时空开销. 到了80年代为了解决这一问题,出现了更小的独立运行基本 ...

  10. 多线程合集(一)---信号量,锁,以及并发编程,自定义任务调度和awaiter

    引言 在后端开发中,多线程技术总是后端开发中常用到的技术,那什么是多线程呢,在操作系统中,程序运行的最小单位是进程,那线程则是进程里面的最小单位,关系是一对多的关系,而线程的调度,是由操作系统的时间片 ...