我正在使Android Native Gaming App自动化,我们的应用程序呈现来自不同广告网络的广告。提交每个游戏后,您可能会看到静态广告和视频广告,或者根本看不到广告。如果找到视频广告,则可能需要30秒到1分钟。 重要的是,当我使用Appium检查器监视各种视频广告屏幕时,只能通过Class(android.webkit.WebView,android.widget.VideoView,android.widget.Button,android.view.View,android.widget.Image &android.widget.ImageView。)。广告播放完毕后,我们需要点击设备后退按钮并玩下一局游戏。 您能提出任何自动化此类应用程序的好方法吗?任何示例代码都非常感谢。
答案 0 :(得分:0)
选项I:,您需要让开发人员创建没有广告的应用程序版本。
优势-没有广告。
缺点-您将不会测试与计划发布的代码完全相同的代码。
您只能禁用全屏广告。
我认为没有最好的方法。稳定的自动化检查或检查与计划发布的代码完全相同的代码。
选项II:用于捕获广告是否可见,然后按返回按钮。
例如(以Android为例)
protected boolean checkAdvert(AppiumDriver<WebElement> driver, int timeout) {
By adTree = By.xpath("//hierarchy/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]");
Map<String, Object> adParams = new HashMap<>();
//trying to wait for the ad to come up and then click the Expense button
driver.manage().timeouts().implicitlyWait(0, TimeUnit.SECONDS);
driver.context("NATIVE_APP");
FluentWait<WebDriver> await = new FluentWait<WebDriver> (driver)
.withTimeout(timeout, TimeUnit.SECONDS)
.pollingEvery(500, TimeUnit.MILLISECONDS)
.ignoring(NoSuchElementException.class);
try {
await.until (ExpectedConditions.visibilityOf(driver.findElement(adTree)));
// go BACK to eliminate the popup
adParams.clear();
adParams.put("keySequence", "BACK");
driver.executeScript("mobile:presskey", adParams);
System.out.println("Press the back button to get out of ad");
return true;
} catch (Exception t) {
System.out.println("no ad showed up");
return false;
}
}
并在页面对象类中使用它:
public void addExp(String desc, String amount) {
do {
try {
driver.context("WEBVIEW");
driver.findElement(expDesc).sendKeys(desc);
driver.findElement(expAmnt).sendKeys(amount);
adClick = false;
} catch (NoSuchElementException ne) {
adClick = checkAdvert(driver, 1);
if (!adClick) throw ne;
}
} while (adClick);
}
但是您必须记住广告可能有所不同,您可以尝试找到通用选择器。但是我认为很难涵盖所有情况。
adTree = By.xpath("//hierarchy/android.widget.FrameLayout[1]/android.widget.LinearLayout[1]/android.widget.FrameLayout[1]/android.widget.RelativeLayout[1]");