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