selenium - 使用页面对象模型的appium框架的最佳实践是什么
问题描述
我正在使用 Appium(在 java 中)为移动应用程序开发自动化框架。我开始为每个视图创建一个类,在每个类中,我找到并初始化该类的元素。现在过了一会儿,我明白我的框架配置不正确,我无法扩展它。如果有人可以在 Github 上向我介绍一个已实现的框架,那就太好了。
这是我的配置类,我使用 setdriver() 在任何需要的地方设置驱动程序。
public class Config {
public AndroidDriver<AndroidElement> driver;
public static AndroidDriver<AndroidElement> SetDriver() throws MalformedURLException {
File appPath= new File("src");
File app = new File(appPath,"My-debug.apk");
DesiredCapabilities cap = new DesiredCapabilities();
cap.setCapability(MobileCapabilityType.DEVICE_NAME, "myDevice");
cap.setCapability(MobileCapabilityType.APP,app.getAbsolutePath());
cap.setCapability("autoGrantPermissions",true);
cap.setCapability("appWaitActivity","com.xxxx.xxxx.ui.launch.LaunchActivity");
AndroidDriver<AndroidElement> driver = new AndroidDriver<AndroidElement>(new URL("http://127.0.0.1:4723/wd/hub"),cap);
return driver;
}
先感谢您。
解决方案
首先,您必须创建加载驱动程序的基类。 注意:如果您使用线程本地,我们可以实现并行执行没有任何问题
package com.vg.ui.utils.mobile;
import io.appium.java_client.AppiumDriver;
import io.appium.java_client.android.AndroidDriver;
import java.io.File;
import java.net.MalformedURLException;
import java.net.URL;
import org.openqa.selenium.remote.CapabilityType;
import org.openqa.selenium.remote.DesiredCapabilities;
public class Mobile {
public static ThreadLocal<AppiumDriver> driverThread = new ThreadLocal<AppiumDriver>();
public void setDriver(String deviceName, String platformVersion)
throws MalformedURLException, InterruptedException {
// TODO Auto-generated method stub
File classpathRoot = new File(System.getProperty("user.dir"));
File appDir = new File(classpathRoot, "Apps");
File app = new File(appDir, "android-debug.apk");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability(CapabilityType.BROWSER_NAME, "");
capabilities.setCapability("deviceName", deviceName);
capabilities.setCapability("platformVersion", platformVersion);
capabilities.setCapability("platformName", "Android");
capabilities.setCapability("app", app.getAbsolutePath());
if (deviceName.equals("Nexus6")) {
driverThread.set(new AndroidDriver(new URL("http://127.0.0.1:4723/wd/hub"), capabilities));
} else if (deviceName.equals("Nexus7")) {
driverThread.set(new AndroidDriver(new URL(
"http://127.0.0.1:4724/wd/hub"), capabilities));
} else if (deviceName.equals("Lenovo")) {
driverThread.set(new AndroidDriver(new URL(
"http://127.0.0.1:4723/wd/hub"), capabilities));
} else {
System.out.println("Check the device name and platformversion");
}
}
public static AppiumDriver getDriver() {
return driverThread.get();
}
public static void closeDriver() {
if (!getDriver().equals(null)) {
getDriver().quit();
}
}
}
第二:使用 PageFactory 方法为特定页面创建一个对象类。
package com.vg.ui.pageobjects;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
public class LandingPageObject {
@FindBy(xpath = "//*[@text='Account Create']")
WebElement btn_accountCreate;
public void click_AccountCreate(){
/*driverUtil.clickandWait(btn_accountCreate);*/
btn_accountCreate.click();
}
}
第三:然后在您的步骤定义类中使用相应屏幕的 PageFactory 扩展 Mobile 驱动程序类,如下所示。
package com.vg.ui.stepdefinitions;
import org.openqa.selenium.support.PageFactory;
import com.vg.ui.pageobjects.LandingPageObject;
import com.vg.ui.utils.mobile.Mobile;
import cucumber.api.java.en.When;
public class LandingPage extends Mobile{
LandingPageObject lp = PageFactory.initElements(getDriver(), LandingPageObject.class);
@When("^click on the button account create\\.$")
public void click_on_the_button_account_create() throws Throwable {
// Write code here that turns the phrase above into concrete actions
lp.click_AccountCreate();
}
}
推荐阅读
- build - 如何在创建角度构建时排除特定文件夹
- java - 我需要在java中找到一棵树的节点总数
- c# - 如何使用 Newtonsoft json 捕获和处理无效的 json 异常?
- excel - 如何从 Excel 激活 Word 文档?
- laravel - Flutter - 使用 laravel api 进行条带支付
- node.js - 表达猫鼬填充问题
- ruby-on-rails - 自定义属性被忽略:不限于顶级 :root 元素 (:root { ... --font-size-tiny: ... }),在 atrule
- android - 我是否正确实施了 MVP 架构?
- html - 移动多个对象的 CSS 动画
- c++ - SetPos() 在 MainWindow 之外无法正确显示