• 记录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

    说明:

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

  • 相关阅读:
    Net设计模式实例之简单工厂模式(Simple Factory Pattern)
    Net设计模式实例系列文章总结
    2019年工作总结
    在Asp.Net Core中集成Kafka(中)
    如何将生产环境的服务Docker镜像拉取到本地进行调试
    记一次EFCore类型转换错误及解决方案
    Asp.Net Core中创建多DbContext并迁移到数据库
    ABP中的AutoMapper
    EFCore中的导航属性
    Asp.Net Core 调用第三方Open API查询物流数据
  • 原文地址:https://www.cnblogs.com/xiaodingdong/p/11718947.html
Copyright © 2020-2023  润新知