一: 元素类

整体思路:

1. 根据状态可分可见和不可见两种

2. 同一个路径可以查找单个元素或多个元素

3. 获取元素text或者指定的value值

4. selenium对元素操作有两种,一是通过By来操作,二是通过js来操作

二: 浏览器

整体思路:

1. 区分四种浏览器的调用

2. 设置每个浏览器的配置

3. 打开跟关闭浏览器

三:元素实现方式

定义一个接口InterfaceShow,两个实现类ExecuteProtogenesis和ExecuteFramework

InterfaceShow:主要列出函数。

ExecuteProtogenesis: 主要运行selenium内置函数来实现预期

ExecuteFramework:主要运行js来实现效果

InterfaceShow代码如下:

 package toolskit.exhibition;

 import org.openqa.selenium.WebElement;

 import java.util.List;

 /**
* 实现类为:
* ExecuteProtogenesis : 主要运行js来实现效果
* ExecuteFramework : 主要运行selenium内置函数来实现预期
*/
public interface InterfaceShow { /**
* 用于判断元素是否可见或焦点是否集中在该元素上
* @param elePath 元素路径
* @param eleType 路径类型
*/
WebElement VisibleFocus(String elePath, String eleType); /**
* 根据路径获取相关联的全部元素
* @param elePath 元素路径
* @param eleType 路径类型
* @return 返回路径下的全部元素
*/
List<WebElement> VisibleFocusGruop(String elePath, String eleType); /**
* 用于判断元素是否隐藏或焦点是否该元素上失去
* @param elePath 元素路径
* @param eleType 路径类型
*/
boolean HideFocus(String elePath, String eleType); /**
* 找到元素后进行输入操作或直接通过js进行输入操作
* @param elePath 元素路径
* @param eleType 元素对象
* @param eleData 输入内容
*/
void HandleVisibleInput(String elePath, String eleType, WebElement pageTab, String eleData); /**
* 找到元素后进行点击操作或直接通过js进行点击操作
* @param elePath 元素路径
* @param eleType 路径类型
*/
void HandleVisibleTouch(String elePath, String eleType, WebElement pageTab); /**
* 通过元素来执行输入操作或者指定元素来执行js输入操作
* @param pageTab 元素本身
* @param eleData 输入内容
*/
void PerformInputAction(WebElement pageTab, String eleData); /**
* 通过元素来执行点击操作或者指定元素来执行js点击操作
* @param pageTab 元素本身
*/
void PerformTouchAction(WebElement pageTab); /**
* 获取元素的属性或者text
* @param elePath 元素路径
* @param eleType 路径类型
* @param pageTab 元素本身
* @return 返回元素的text或者指定value值
*/
String getAttributeTextValue(String elePath, String eleType, WebElement pageTab, String valueType);
}

ExecuteProtogenesis代码如下(js这块还有一些问题):

 package toolskit.exhibition;

 import java.util.List;

 import org.openqa.selenium.*;

 /**
* 该函数尚未完成
*/
public class ExecuteProtogenesis implements InterfaceShow { private JavascriptExecutor driver_js ; public ExecuteProtogenesis(WebDriver driver){
this.driver_js = ((JavascriptExecutor) driver); }
/**
* 通过js来查找元素
* @param elePath 元素路径
* @param eleType 路径类型;目前没用到。
* @return 单个元素对象
*/
@Override
public WebElement VisibleFocus(String elePath, String eleType) {
return null; } /**
*
* @param elePath 元素路径
* @param eleType 路径类型
* @return 返回路径下的全部元素
*/
@Override
public List<WebElement> VisibleFocusGruop(String elePath, String eleType) {
return null;
} /**
* 通过js来判断元素是否隐藏;该函数有坑不建议用
* @param elePath 元素路径
* @param eleType 路径类型;目前尚未使用
* @return 布尔值
*/
@Override
public boolean HideFocus(String elePath, String eleType) {
return false;
} /**
* 通过js来对元素进行输入操作
* @param elePath 元素路径
* @param eleType 元素对象
* @param eleData 输入内容
*/
@Override
public void HandleVisibleInput(String elePath, String eleType,WebElement pageTab, String eleData) { } /**
* 通过js来对元素进行点击操作
* @param elePath 元素路径
* @param eleType 路径类型
*/
@Override
public void HandleVisibleTouch(String elePath, String eleType,WebElement pageTab) { } /**
* 通过已找到的元素进行输入操作
* @param pageTab 元素本身
* @param eleData 输入内容
*/
@Override
public void PerformInputAction(WebElement pageTab, String eleData) {
driver_js.executeScript("arguments[0].value='" + eleData + "'", pageTab);
}
/**
* 通过已找到的元素进行点击操作
* @param pageTab 元素本身
*/
@Override
public void PerformTouchAction(WebElement pageTab) {
driver_js.executeScript("arguments[0].click()", pageTab);
} @Override
public String getAttributeTextValue(String elePath, String eleType, WebElement pageTab,String valueType) {
String text = (String) driver_js.executeScript("return arguments[0].value", pageTab);
if (text==null){
text = "";
}
return text;
} }

ExecuteFramework代码如下:

 package toolskit.exhibition;

 import java.util.List;

 import org.openqa.selenium.By;
import org.openqa.selenium.TimeoutException;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
import org.testng.Assert; public class ExecuteFramework implements InterfaceShow { WebDriver driver; private final int TIME_OUT_SECONDS = 5 ; public ExecuteFramework(WebDriver driver){
this.driver = driver;
} public By distinguishByAttribute(String elePath, String pathType) {
By eleBy ;
if(elePath ==null||elePath.equals("")||pathType ==null||pathType.equals("")){
return null;
} switch (pathType) {
case "id":
eleBy = By.id(elePath);
break;
case "xpath":
eleBy = By.xpath(elePath);
break;
case "css":
eleBy = By.cssSelector(elePath);
break;
case "name":
eleBy = By.name(elePath);
break;
default:
eleBy = null;
}
return eleBy;
} @Override
public WebElement VisibleFocus(String elePath, String eleType) {
By by = distinguishByAttribute(elePath, eleType);
if (by == null){
Assert.assertFalse(false);
}
WebElement username = null;
try {
username = new WebDriverWait(driver, TIME_OUT_SECONDS)
.until(ExpectedConditions.visibilityOfElementLocated(by));
} catch (TimeoutException a) {
a.printStackTrace();
} return username;
} @Override
public List<WebElement> VisibleFocusGruop(String elePath, String eleType) {
By by = distinguishByAttribute(elePath, eleType);
if (by == null){
Assert.assertFalse(false);
}
List<WebElement> eleList =null;
try {
eleList = new WebDriverWait(driver, TIME_OUT_SECONDS)
.until(ExpectedConditions.visibilityOfAllElementsLocatedBy(by));
} catch (TimeoutException a) {
a.printStackTrace();
}
return eleList;
} @Override
public boolean HideFocus(String elePath, String eleType) {
By by = distinguishByAttribute(elePath, eleType);
if (by == null){
Assert.assertFalse(false);
}
//页面元素在页面是否存在
boolean hide= false;
try {
WebElement until = new WebDriverWait(driver, TIME_OUT_SECONDS).until(ExpectedConditions.presenceOfElementLocated(by));
if(until != null){
hide = true;
}
} catch (TimeoutException a) {
// a.printStackTrace();
}
return hide;
} @Override
public void HandleVisibleInput(String elePath, String eleType, WebElement pageTab, String eleData) {
if (pageTab!=null) {
PerformInputAction(pageTab, eleData);
}else{
pageTab = VisibleFocus(elePath, eleType);
if (pageTab!=null){
PerformInputAction(pageTab,eleData);
}
}
} @Override
public void HandleVisibleTouch(String elePath, String eleType,WebElement pageTab) {
if (pageTab!=null){
PerformTouchAction(pageTab);
}else {
pageTab = VisibleFocus(elePath, eleType);
if (pageTab!=null){
PerformTouchAction(pageTab);
}
}
} @Override
public void PerformInputAction(WebElement pageTab, String eleData) {
try {
pageTab.clear();
pageTab.sendKeys(eleData);
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
} @Override
public void PerformTouchAction(WebElement pageTab) {
try {
pageTab.click();
Thread.sleep(1000);
} catch (InterruptedException e) {
e.printStackTrace();
}
}
private String getElementValue(WebElement pageTab,String valueType){
String textValue ; if (valueType.equalsIgnoreCase("text")){
textValue = pageTab.getText(); }else {
textValue = pageTab.getAttribute(valueType);
}
return textValue;
}
@Override
public String getAttributeTextValue(String elePath, String eleType, WebElement pageTab,String valueType) {
if(pageTab==null){
pageTab = VisibleFocus(elePath, eleType);
} String value = getElementValue(pageTab, valueType);
return value;
}
}

四:浏览器实现方式---采用工厂模式

CarrierDriver 为工厂接口类,

BrowserDriver 为工厂实现父类

ChromeBrowser/FireFoxBrowser/WinEdgeBrowser/WinIEBrowser:作为子类分别继承BrowserDriver

DriverFactory:工厂判断类,通过传入浏览器的类型来创建相应的工厂浏览器类

整体代码比较多,可以到上一篇文件中下载源码。https://www.cnblogs.com/xiaodingdong/p/11718667.html

说明:

toolskit\incomprehension : 目录下自定义的错误类是拿网上的,网址没保留。这里不方便贴出。有需要的可以拿来使用。

记录java+testng运行selenium(二)---定义元素类及浏览器的更多相关文章

  1. 记录java+testng运行selenium(四)--- 运行代码

    涉及的文件有: .\medical\BusinessFile.java :实例化excel及xml文件操作对象以及将list变成Map .\medical\manual\business\LoginB ...

  2. 记录java+testng运行selenium(三)---xml、ini、excel、日志等配置

    一: ini文件 ini目前只用处存储浏览类型及需要打开的url,ini文件放在configs文件夹下面. 读取ini代码如下: package toolskit.documents; import ...

  3. 记录java+testng运行selenium(四)--- 结构说明

    一图:主要是driver文件所在目录,及ini配置文件所在位置. 这两个文件一般我是放在其它目录下,不跟随项目所在目录 二图:用例操作类及用例执行类所在位置. 下图中有接口代码及功能代码组成,之前的文 ...

  4. 记录java+testng运行selenium(一)

    整体的流程为下图 整体思路为: 1. 由程序开始运行时去读取ini文件中存储的浏览器及需要打开的url 2. test运行时通过description实现数据驱动,主要做两件事 2.1 第一件事为:读 ...

  5. selenium从入门到应用 - 1,环境准备(Java+TestNG+Maven+Selenium)

    本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境的 ...

  6. Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件?

    ylbtech-Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件? 1.返回顶部 1. Java 实例 - 如何执行编译过 Java ...

  7. 转: 深入Java虚拟机】之二:Class类文件结构

    转载请注明出处:http://blog.csdn.net/ns_code/article/details/17675609 平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存 ...

  8. 【深入Java虚拟机】之二:Class类文件结构

    平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...

  9. java基础(十二)常用类总结(二)

    这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...

随机推荐

  1. 戒邪淫利器:《楞严经 四种清净明诲》实例及原经文 (转自学佛网:http://www.xuefo.net/nr/article55/545256.html)

    今日得持首楞严,不读天下糟粕书! 当你读完楞严经后就会很真实的升起这个感觉!根本觉得其他书都是多余的!所以<楞严经>还是要多读,多看!并且<楞严经>戒淫的效果特别好!好好的珍惜 ...

  2. Sequelize 类 建立数据库连接 模型定义

    1:Sequelize 类 Sequelize是引用Sequelize模块获取的一个顶级对象,通过这个类可以获取模块内对其他对象的引用.比如utils.Transaction事务类.通过这个顶级对象创 ...

  3. vue react 路由history模式刷新404问题解决方案

    vue单页因微信分享和自动登录需要,对于URL中存在’#’的地址,处理起来比较坑.用history模式就不会存在这样的问题.但是换成history模式,就会有个新的问题,就是页面刷新后,页面就无法显示 ...

  4. 向多个git仓库提交

    查看所有远程仓库 为了不用每次输密码,可以先配置ssh key 查看 添加远程仓库 git remote add origin1 git@other:YYYYYYYYYY/AA.git 向新的代码仓库 ...

  5. git的使用学习(二)git的操作使用

    1.创建版本库 什么是版本库呢?版本库又名仓库,英文名repository,你可以简单理解成一个目录,这个目录里面的所有文件都可以被Git管理起来,每个文件的修改.删除,Git都能跟踪,以便任何时刻都 ...

  6. 《C语言程序设计》课程教学目录

    <C语言程序设计>课程教学目录 不要去精确定义单个论题,应将一整套问题组织成体系.--黎曼(1826-1866)德国著名数学家 教学过程 2018年秋季学期 C语言程序设计I-第一周教学 ...

  7. 【作业】Kitchen Plates(拓扑排序)

    题目链接:https://vjudge.net/contest/345791#problem/O [问题描述] You are given 5 different sizes of kitchen p ...

  8. [WCF] - Odata Service 访问失败,查看具体错误信息的方法

    Issue 解决 为 Data Service 配置属性如下:[System.ServiceModel.ServiceBehavior(IncludeExceptionDetailInFaults = ...

  9. c++中继承的使用

    1.c++中继承有公有继承,保护继承,私有继承 定义个基类: #include using namespace std; class Base { public: void display() { c ...

  10. go context 源码分析

    WithCancel func WithCancel(parent Context) (ctx Context, cancel CancelFunc) { c := newCancelCtx(pare ...