记录java+testng运行selenium(二)---定义元素类及浏览器
一: 元素类
整体思路:
1. 根据状态可分可见和不可见两种
2. 同一个路径可以查找单个元素或多个元素
3. 获取元素text或者指定的value值
4. selenium对元素操作有两种,一是通过By来操作,二是通过js来操作
二: 浏览器
整体思路:
1. 区分四种浏览器的调用
2. 设置每个浏览器的配置
3. 打开跟关闭浏览器
三:元素实现方式
定义一个接口InterfaceShow,两个实现类ExecuteProtogenesis和ExecuteFramework
InterfaceShow:主要列出函数。
ExecuteProtogenesis: 主要运行selenium内置函数来实现预期
ExecuteFramework:主要运行js来实现效果
InterfaceShow代码如下:
1 package toolskit.exhibition; 2 3 import org.openqa.selenium.WebElement; 4 5 import java.util.List; 6 7 /** 8 * 实现类为: 9 * ExecuteProtogenesis : 主要运行js来实现效果 10 * ExecuteFramework : 主要运行selenium内置函数来实现预期 11 */ 12 public interface InterfaceShow { 13 14 /** 15 * 用于判断元素是否可见或焦点是否集中在该元素上 16 * @param elePath 元素路径 17 * @param eleType 路径类型 18 */ 19 WebElement VisibleFocus(String elePath, String eleType); 20 21 /** 22 * 根据路径获取相关联的全部元素 23 * @param elePath 元素路径 24 * @param eleType 路径类型 25 * @return 返回路径下的全部元素 26 */ 27 List<WebElement> VisibleFocusGruop(String elePath, String eleType); 28 29 /** 30 * 用于判断元素是否隐藏或焦点是否该元素上失去 31 * @param elePath 元素路径 32 * @param eleType 路径类型 33 */ 34 boolean HideFocus(String elePath, String eleType); 35 36 /** 37 * 找到元素后进行输入操作或直接通过js进行输入操作 38 * @param elePath 元素路径 39 * @param eleType 元素对象 40 * @param eleData 输入内容 41 */ 42 void HandleVisibleInput(String elePath, String eleType, WebElement pageTab, String eleData); 43 44 /** 45 * 找到元素后进行点击操作或直接通过js进行点击操作 46 * @param elePath 元素路径 47 * @param eleType 路径类型 48 */ 49 void HandleVisibleTouch(String elePath, String eleType, WebElement pageTab); 50 51 /** 52 * 通过元素来执行输入操作或者指定元素来执行js输入操作 53 * @param pageTab 元素本身 54 * @param eleData 输入内容 55 */ 56 void PerformInputAction(WebElement pageTab, String eleData); 57 58 /** 59 * 通过元素来执行点击操作或者指定元素来执行js点击操作 60 * @param pageTab 元素本身 61 */ 62 void PerformTouchAction(WebElement pageTab); 63 64 65 /** 66 * 获取元素的属性或者text 67 * @param elePath 元素路径 68 * @param eleType 路径类型 69 * @param pageTab 元素本身 70 * @return 返回元素的text或者指定value值 71 */ 72 String getAttributeTextValue(String elePath, String eleType, WebElement pageTab, String valueType); 73 }
ExecuteProtogenesis代码如下(js这块还有一些问题):
1 package toolskit.exhibition; 2 3 import java.util.List; 4 5 import org.openqa.selenium.*; 6 7 8 9 10 /** 11 * 该函数尚未完成 12 */ 13 public class ExecuteProtogenesis implements InterfaceShow { 14 15 private JavascriptExecutor driver_js ; 16 17 public ExecuteProtogenesis(WebDriver driver){ 18 this.driver_js = ((JavascriptExecutor) driver); 19 20 } 21 /** 22 * 通过js来查找元素 23 * @param elePath 元素路径 24 * @param eleType 路径类型;目前没用到。 25 * @return 单个元素对象 26 */ 27 @Override 28 public WebElement VisibleFocus(String elePath, String eleType) { 29 return null; 30 31 } 32 33 /** 34 * 35 * @param elePath 元素路径 36 * @param eleType 路径类型 37 * @return 返回路径下的全部元素 38 */ 39 @Override 40 public List<WebElement> VisibleFocusGruop(String elePath, String eleType) { 41 return null; 42 } 43 44 /** 45 * 通过js来判断元素是否隐藏;该函数有坑不建议用 46 * @param elePath 元素路径 47 * @param eleType 路径类型;目前尚未使用 48 * @return 布尔值 49 */ 50 @Override 51 public boolean HideFocus(String elePath, String eleType) { 52 return false; 53 } 54 55 /** 56 * 通过js来对元素进行输入操作 57 * @param elePath 元素路径 58 * @param eleType 元素对象 59 * @param eleData 输入内容 60 */ 61 @Override 62 public void HandleVisibleInput(String elePath, String eleType,WebElement pageTab, String eleData) { 63 64 } 65 66 /** 67 * 通过js来对元素进行点击操作 68 * @param elePath 元素路径 69 * @param eleType 路径类型 70 */ 71 @Override 72 public void HandleVisibleTouch(String elePath, String eleType,WebElement pageTab) { 73 74 } 75 76 /** 77 * 通过已找到的元素进行输入操作 78 * @param pageTab 元素本身 79 * @param eleData 输入内容 80 */ 81 @Override 82 public void PerformInputAction(WebElement pageTab, String eleData) { 83 driver_js.executeScript("arguments[0].value='" + eleData + "'", pageTab); 84 } 85 /** 86 * 通过已找到的元素进行点击操作 87 * @param pageTab 元素本身 88 */ 89 @Override 90 public void PerformTouchAction(WebElement pageTab) { 91 driver_js.executeScript("arguments[0].click()", pageTab); 92 } 93 94 @Override 95 public String getAttributeTextValue(String elePath, String eleType, WebElement pageTab,String valueType) { 96 String text = (String) driver_js.executeScript("return arguments[0].value", pageTab); 97 if (text==null){ 98 text = ""; 99 } 100 return text; 101 } 102 103 }
ExecuteFramework代码如下:
1 package toolskit.exhibition; 2 3 import java.util.List; 4 5 import org.openqa.selenium.By; 6 import org.openqa.selenium.TimeoutException; 7 import org.openqa.selenium.WebDriver; 8 import org.openqa.selenium.WebElement; 9 import org.openqa.selenium.support.ui.ExpectedConditions; 10 import org.openqa.selenium.support.ui.WebDriverWait; 11 import org.testng.Assert; 12 13 14 public class ExecuteFramework implements InterfaceShow { 15 16 WebDriver driver; 17 18 private final int TIME_OUT_SECONDS = 5 ; 19 20 public ExecuteFramework(WebDriver driver){ 21 this.driver = driver; 22 } 23 24 public By distinguishByAttribute(String elePath, String pathType) { 25 By eleBy ; 26 if(elePath ==null||elePath.equals("")||pathType ==null||pathType.equals("")){ 27 return null; 28 } 29 30 switch (pathType) { 31 case "id": 32 eleBy = By.id(elePath); 33 break; 34 case "xpath": 35 eleBy = By.xpath(elePath); 36 break; 37 case "css": 38 eleBy = By.cssSelector(elePath); 39 break; 40 case "name": 41 eleBy = By.name(elePath); 42 break; 43 default: 44 eleBy = null; 45 } 46 return eleBy; 47 } 48 49 @Override 50 public WebElement VisibleFocus(String elePath, String eleType) { 51 By by = distinguishByAttribute(elePath, eleType); 52 if (by == null){ 53 Assert.assertFalse(false); 54 } 55 WebElement username = null; 56 try { 57 username = new WebDriverWait(driver, TIME_OUT_SECONDS) 58 .until(ExpectedConditions.visibilityOfElementLocated(by)); 59 } catch (TimeoutException a) { 60 a.printStackTrace(); 61 } 62 63 return username; 64 } 65 66 @Override 67 public List<WebElement> VisibleFocusGruop(String elePath, String eleType) { 68 By by = distinguishByAttribute(elePath, eleType); 69 if (by == null){ 70 Assert.assertFalse(false); 71 } 72 List<WebElement> eleList =null; 73 try { 74 eleList = new WebDriverWait(driver, TIME_OUT_SECONDS) 75 .until(ExpectedConditions.visibilityOfAllElementsLocatedBy(by)); 76 } catch (TimeoutException a) { 77 a.printStackTrace(); 78 } 79 return eleList; 80 } 81 82 @Override 83 public boolean HideFocus(String elePath, String eleType) { 84 By by = distinguishByAttribute(elePath, eleType); 85 if (by == null){ 86 Assert.assertFalse(false); 87 } 88 //页面元素在页面是否存在 89 boolean hide= false; 90 try { 91 WebElement until = new WebDriverWait(driver, TIME_OUT_SECONDS).until(ExpectedConditions.presenceOfElementLocated(by)); 92 if(until != null){ 93 hide = true; 94 } 95 } catch (TimeoutException a) { 96 // a.printStackTrace(); 97 } 98 return hide; 99 } 100 101 @Override 102 public void HandleVisibleInput(String elePath, String eleType, WebElement pageTab, String eleData) { 103 if (pageTab!=null) { 104 PerformInputAction(pageTab, eleData); 105 }else{ 106 pageTab = VisibleFocus(elePath, eleType); 107 if (pageTab!=null){ 108 PerformInputAction(pageTab,eleData); 109 } 110 } 111 } 112 113 @Override 114 public void HandleVisibleTouch(String elePath, String eleType,WebElement pageTab) { 115 if (pageTab!=null){ 116 PerformTouchAction(pageTab); 117 }else { 118 pageTab = VisibleFocus(elePath, eleType); 119 if (pageTab!=null){ 120 PerformTouchAction(pageTab); 121 } 122 } 123 } 124 125 @Override 126 public void PerformInputAction(WebElement pageTab, String eleData) { 127 try { 128 pageTab.clear(); 129 pageTab.sendKeys(eleData); 130 Thread.sleep(1000); 131 } catch (InterruptedException e) { 132 e.printStackTrace(); 133 } 134 } 135 136 @Override 137 public void PerformTouchAction(WebElement pageTab) { 138 try { 139 pageTab.click(); 140 Thread.sleep(1000); 141 } catch (InterruptedException e) { 142 e.printStackTrace(); 143 } 144 } 145 private String getElementValue(WebElement pageTab,String valueType){ 146 String textValue ; 147 148 149 if (valueType.equalsIgnoreCase("text")){ 150 textValue = pageTab.getText(); 151 152 }else { 153 textValue = pageTab.getAttribute(valueType); 154 } 155 return textValue; 156 } 157 @Override 158 public String getAttributeTextValue(String elePath, String eleType, WebElement pageTab,String valueType) { 159 if(pageTab==null){ 160 pageTab = VisibleFocus(elePath, eleType); 161 } 162 163 String value = getElementValue(pageTab, valueType); 164 return value; 165 } 166 }
四:浏览器实现方式---采用工厂模式
CarrierDriver 为工厂接口类,
BrowserDriver 为工厂实现父类
ChromeBrowser/FireFoxBrowser/WinEdgeBrowser/WinIEBrowser:作为子类分别继承BrowserDriver
DriverFactory:工厂判断类,通过传入浏览器的类型来创建相应的工厂浏览器类
整体代码比较多,可以到上一篇文件中下载源码。https://www.cnblogs.com/xiaodingdong/p/11718667.html
说明:
toolskit\incomprehension : 目录下自定义的错误类是拿网上的,网址没保留。这里不方便贴出。有需要的可以拿来使用。