Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/selenium/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java JUnit/Selenium:拆分类以使用页面对象模型_Java_Selenium_Selenium Webdriver_Junit - Fatal编程技术网

Java JUnit/Selenium:拆分类以使用页面对象模型

Java JUnit/Selenium:拆分类以使用页面对象模型,java,selenium,selenium-webdriver,junit,Java,Selenium,Selenium Webdriver,Junit,意识到这可能是一个很大的问题,但我在拆分测试类以使用页面对象模型时遇到了困难 我目前的课程基本上是这样的: @BeforeClass-startUp()加载变量的属性文件并启动ChromeDriverService @Before-createDriver()打开Chrome浏览器,导航至主页 @测试-desktopHappyCallback()执行一些页面交互,然后调用: 隐藏动态元素()隐藏页面上的某些元素 runScreenshotValidation()保存屏幕截图并通过调用以下命令进行

意识到这可能是一个很大的问题,但我在拆分测试类以使用页面对象模型时遇到了困难

我目前的课程基本上是这样的:

  • @BeforeClass-startUp()加载变量的属性文件并启动ChromeDriverService
  • @Before-createDriver()打开Chrome浏览器,导航至主页
  • @测试-desktopHappyCallback()执行一些页面交互,然后调用:
  • 隐藏动态元素()隐藏页面上的某些元素
  • runScreenshotValidation()保存屏幕截图并通过调用以下命令进行比较:
  • compareScreen()比较并返回真/假值
  • @在-拆卸()之后退出ChromeDriver
  • @AfterClass-stopService()终止ChromeDriver服务
  • 该类当前为(已从方法中删除位以使其更短):

    公共类桌面应用程序{
    专用静态传输服务;
    私有静态WebDriver;
    私有静态属性obj=新属性();
    //通过im4java设置屏幕截图比较
    私有静态布尔比较屏幕(字符串expectedImage、字符串currentImage、字符串diffImage){
    CompareCmd compare=新的CompareCmd();
    compare.setErrorConsumer(StandardStream.STDERR);
    iOperation Comparisonex=新iOperation();
    comparisonex.metric(“mae”);//mae=平均绝对误差(所有色差的平均值)
    ComparisonNexe.addImage(当前图像);
    }
    //通过ImageMajick进行比较
    私有void runScreenshotValidation()引发IOException,InfoException{
    String current=“屏幕截图\\current\\current.png”;
    boolean compareSuccess=compareScreen(基线、当前、差异);//运行compare方法
    }
    }
    //隐藏页面上的动态元素(如果存在)
    private void hideDynamicElements()引发IOException、InterruptedException{
    列表条件=Arrays.asList(
    By.className(“电话号码”),
    通过.cssSelector(“#chatContainer”),
    );
    for(By dynamicElement:criteria){//循环遍历条件
    列表元素=driver.findElements(dynamicElement);
    for(WebElement-hideElement:elements){//循环遍历元素的每个实例
    ((JavascriptExecutor)driver.executeScript(“参数[0].style.visibility='hidden',hideElement”);
    }
    }
    @BeforeClass//提取属性,并在测试运行之前启动ChromeDriver服务
    公共静态void startUp()引发IOException{
    FileInputStream propfile=新的FileInputStream(System.getProperty
    (“user.dir”)+“\\src\\main\\resources\\config.properties”);
    对象加载(propfile);
    service=new ChromeDriverService.Builder()
    .usingDriverExecutable(新文件(obj.getProperty(“chromeDriverLoc”))//属性中的驱动程序集
    .usingAnyFreePort()
    .build();
    service.start();
    }
    @前//每次测试前启动Chrome浏览器(在主页上)
    public void createDriver(){
    driver=新的RemoteWebDriver(service.getUrl(),DesiredCapabilities.chrome());
    driver.get(obj.getProperty(“targetENV”);//打开主页(在属性中设置)
    }
    @测试//检查回调表单(模态)
    public void desktopHappyCallback()引发异常{
    driver.findElement(By.cssSelector(“#callbackInputPhone”)).sendKeys(obj.getProperty(“formsPhone”));
    findElement(By.xpath(“//input[@value='Request a callback']))。单击();
    WebDriverWaitForSuccessMessage=新的WebDriverWait(驱动程序,5);
    waitForSuccessMessage.until(ExpectedConditions.Element可禁用
    (由.cssSelector(“callbackForm>div.success-message”);
    hideDynamicElements();//运行hide dynamic elements方法
    runScreenshotValidation();//运行屏幕截图比较方法
    }
    @在//之后,在每次测试后退出ChromeDriver
    public void tearDown()引发异常{
    driver.quit();
    }
    @AfterClass//在测试结束时终止ChromeDriver服务
    公共静态void stopService(){
    服务。停止();
    }}
    
    因此,在IntelliJ中,我尝试将我的项目与包分开,如下所示:

    我一直在尝试进入baseCompare课程:

    • 隐藏动态元素()
    • 比较屏幕()
    • runScreenshotValidation()
    然后进入基本设置类:

    • 启动()
    • createDriver()
    • 拆卸
    • 停止服务()
    然后,主页将包含我的表述,桌面快乐将包含我的测试断言


    然而,我真的被困在了如何把事情分开,让它们一起工作的问题上。有没有人能给我举个例子,说明我应该如何在这些包下进行拆分?(很抱歉问了这么多!)

    我认为你在很公平地划分你的逻辑

    我唯一要改变的是,将
    base*
    类放在基本包下,而不是实际的
    base

    例如:

    com.salessite/
      baseCompare.java
      baseSetup.java
      basePage.java
      baseTest.java
      pages/
        homePage.java < basePage.java
      tests/
        desktopHappy.java < baseTest.java
    
    com.salessite/
    baseCompare.java
    baseSetup.java
    basePage.java
    baseTest.java
    页数/
    homePage.java
    另外,通过创建更多的
    基础
    ,您可以为将来的更改提供更多的余地

    让他们一起工作

    如果你所说的工作是指编译,那么你应该没有问题。例如,假设
    homePage.java扩展了basePage.java
    ,然后在
    homePage.java
    中,您将获得适当的导入

    导入com.salessite.basePage


    导入是指如何访问外部类和引用。(当然,访问修饰符允许。)

    请记住,Java是一种camelCased语言,是的,但该约定适用于所有cla
    com.salessite/
      baseCompare.java
      baseSetup.java
      basePage.java
      baseTest.java
      pages/
        homePage.java < basePage.java
      tests/
        desktopHappy.java < baseTest.java