记录java+testng运行selenium(二)---定义元素类及浏览器
一: 元素类
整体思路:
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(二)---定义元素类及浏览器的更多相关文章
- 记录java+testng运行selenium(四)--- 运行代码
涉及的文件有: .\medical\BusinessFile.java :实例化excel及xml文件操作对象以及将list变成Map .\medical\manual\business\LoginB ...
- 记录java+testng运行selenium(三)---xml、ini、excel、日志等配置
一: ini文件 ini目前只用处存储浏览类型及需要打开的url,ini文件放在configs文件夹下面. 读取ini代码如下: package toolskit.documents; import ...
- 记录java+testng运行selenium(四)--- 结构说明
一图:主要是driver文件所在目录,及ini配置文件所在位置. 这两个文件一般我是放在其它目录下,不跟随项目所在目录 二图:用例操作类及用例执行类所在位置. 下图中有接口代码及功能代码组成,之前的文 ...
- 记录java+testng运行selenium(一)
整体的流程为下图 整体思路为: 1. 由程序开始运行时去读取ini文件中存储的浏览器及需要打开的url 2. test运行时通过description实现数据驱动,主要做两件事 2.1 第一件事为:读 ...
- selenium从入门到应用 - 1,环境准备(Java+TestNG+Maven+Selenium)
本系列所有代码 https://github.com/zhangting85/simpleWebtest 本文将介绍一个Java+TestNG+Maven+Selenium的web自动化测试脚本环境的 ...
- Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件?
ylbtech-Java-Runoob-高级教程-实例-环境设置实例:2.Java 实例 – Java 如何运行一个编译过的类文件? 1.返回顶部 1. Java 实例 - 如何执行编译过 Java ...
- 转: 深入Java虚拟机】之二:Class类文件结构
转载请注明出处:http://blog.csdn.net/ns_code/article/details/17675609 平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存 ...
- 【深入Java虚拟机】之二:Class类文件结构
平台无关性 Java是与平台无关的语言,这得益于Java源代码编译后生成的存储字节码的文件,即Class文件,以及Java虚拟机的实现.不仅使用Java编译器可以把Java代码编译成存储字节码的Cla ...
- java基础(十二)常用类总结(二)
这里有我之前上课总结的一些知识点以及代码大部分是老师讲的笔记 个人认为是非常好的,,也是比较经典的内容,真诚的希望这些对于那些想学习的人有所帮助! 由于代码是分模块的上传非常的不便.也比较多,讲的也是 ...
随机推荐
- spring 配置事务管理器
在Spring中数据库事务是通过PlatformTransactionManager进行管理的,jdbcTemplate是不能支持事务的,而能够支持事务的是org.springframework.tr ...
- Swift4.0复习基本语法简介
1.五种类型: 包含五种类型——枚举(enum).结构体(struct).类(class).协议( protocol)以及函数类型(function types). 2.变量对象:var 3.常量对象 ...
- css样式圆角和一定的透明度
css样式里可以用border-radius把div或图片变成带有一定圆角的,如果是div本身是正方形,设置圆角度是百分之五十,就是圆形. border-radius:值可以是具体的px数值,也可以是 ...
- ecshop数据表结构说明
深深地看看这个吧,会很有帮助的... ecs_account_log 用户帐号情况记录表,包括资金和积分等 log_id mediumint 自增ID号user_id mediumint 用户登录后保 ...
- 【Leetcode_easy】1051. Height Checker
problem 1051. Height Checker solution class Solution { public: int heightChecker(vector<int>&a ...
- Data - 数据思维 - 下篇
9 - 数据解读与表达 数据解读 数据解读需要选择一个基点.一个参照系,单独的一个数值往往不具备价值,它只是数字. 注意点: 关注异常值,并深究WHY? 相互验证.大胆假设.多方验证. 把握趋势或者规 ...
- INTEL 7代CPU I5 7500 集显HD630 WIN7 64位
HD630 在WIN7 下的硬件ID (在设备管理器 - 显卡 - 属性 中查看): PCI\VEN_8086&DEV_5912&SUBSYS_D0001458&REV_04 ...
- Django: ORM查询中使用or查询
先引入Q,(原名就叫Q) from django.db.models import Q page_user = User.objects.filter(Q(member_code__contains= ...
- linux 大量time_wait的解决方法
通过调整内核参数解决vi /etc/sysctl.conf 编辑文件,加入以下内容:net.ipv4.tcp_syncookies = 1net.ipv4.tcp_tw_reuse = 1net.ip ...
- 雨幕——RainCurtian
今天19年10月14日,也不算是个什么特别的日子.不多能让我的这一天变得特殊的,或许就是在今天我开通了我的第一个博客吧.细想过来每一天都是那么的相似,不过是因为有了某些事情,才变得特殊起来,比如新生命 ...