一: 元素类

整体思路:

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. python 中删除文件中的空白行(回车)

    staff.txt 内容: Alex Li,Engineer,1363432345,alex@126.com Jack Zhang,Salesman,Sales Dep,15697892356,jac ...

  2. Swift4.0复习泛型

    1.泛型的基本使用: /// 定义了一个泛型结构体MyStruct, /// 其泛型形参为T struct MyStruct<T> {   /// 用泛型T定义存储式成员属性t var t ...

  3. JS和vue文本框输入改变p标签的内容测试

    文本框输入,p标签的内容自动变成文本框的内容,如下是三种方法的测试: 方法1:JS里的onchange,当文本框内容改变事件,该事件里写的方法是,获取p标签本身,然后获取文本框的值,赋值给变量,最后给 ...

  4. linux和windows换行符的^M问题

    起源 在windows中写的脚本执行完全没问题,代码一模一样,切换到linux中执行报错.利用命令 “vi/vim -b 文件名”查看文件发现每行结尾多了“^M”这样的结尾. 根源 通过查询得知,其问 ...

  5. github账户初始化设置

    1.首先在github官网https://github.com/上注册自己的账户: 2.去git官网https://git-scm.com/downloads,根据电脑系统下载合适的版本并安装. 3. ...

  6. git 获取线上代码并合并到本地

    //查询当前远程的版本 $ git remote -v //获取最新代码到本地(本地当前分支为[branch],获取的远端的分支为[origin/branch]) $ git fetch origin ...

  7. mysql数据库表的查询

    一.            设有一数据库,包括四个表:学生表(Student).课程表(Course).成绩表(Score)以及教师信息表(Teacher).四个表的结构分别如表1-1的表(一)~表( ...

  8. 三、部署DNS

    通常情况下配置好域后,DNS会默认安装好,但有时候这个DNS只能解析域控的域名,不能解析其他域名,比如baidu.com之类的.此时需要配置转发器,把不能解析的域名转到其他DNS配置如下: 打开DNS ...

  9. javascript加超链接

    JavaScript link 方法:给字符串加上超链接JavaScript link 方法link 方法返回使用 HTML a 标签属性定义的(斜体)字符串.其语法如下:str_object.lin ...

  10. Python for循环生成列表

    一般Python for语句前不加语句,但我在机器学习实战中看到了这两条语句: featList = [example[i] for example in dataSet] classList = [ ...