记录java+testng运行selenium(二)---定义元素类及浏览器

时间:2021-06-18 14:34:11

一: 元素类

整体思路:

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 : 目录下自定义的错误类是拿网上的,网址没保留。这里不方便贴出。有需要的可以拿来使用。