appium - 无法单击 Appium 中未显示的单元格中的元素 - IOS 使用 Java-Client
问题描述
我正在尝试为我们构建的 SDK 创建自动化 E2E 测试。我们决定使用测试应用程序测试 SDK,该应用程序将调用表中的命令来测试所有 SDK 功能。
我被卡住了一段时间,不明白为什么有些点击事件有效而有些无效。
我已经弄清楚了,这是因为正在工作的那些是可见的,而那些不工作的是不可见的(直到在需要可见的时候创建单元格才真正存在?)。无论如何,这就是我的想法或希望,因为如果不是,我真的不明白发生了什么。
有效的代码示例:
@Test
public void step2_resetToken() throws InterruptedException {
int count = 0;
String s;
do {
MobileElement mElement = (MobileElement) iosDriver.findElement(By.name("Reset Token"));
mElement.click();
Thread.sleep(500);
count++;
assert count < TIMEOUTTIME;
s = element.getText();
System.out.println(s);
} while(!(element.getText().contains("reset token performed:")));
}
不工作的代码示例:
@Test
public void step3_isAuthenticatedByPIN() throws InterruptedException {
WebElement tableView = (WebElement) iosDriver.findElementByClassName("XCUIElementTypeTable");
tableView.scrollTo("isAuthenticatedByPIN").click();
int count = 0;
String s;
do {
////XCUIElementTypeStaticText[@name="isAuthenticatedByPIN"]
MobileElement mElement = (MobileElement) iosDriver.findElementByClassName("XCUIElementTypeTable");
mElement.sendKeys("isAuthenticatedByPIN");
mElement.findElement(By.name("isAuthenticatedByPIN"));
mElement.click();
Thread.sleep(500);
count++;
assert count < TIMEOUTTIME;
s = element.getText();
System.out.println(s);
} while(!(element.getText().contains("isAuthenticatedByPIN: YES")));
}
我之前也尝试过调用此方法,因此会有一个滚动,但似乎它只是找不到应用程序启动时不可见的元素:
public static void scrolltoXPath(RemoteWebDriver driver, String xPath) {
RemoteWebElement parent = (RemoteWebElement)driver.findElement(By.className("XCUIElementTypeTable"));
String parentID = parent.getId();
HashMap<String, String> scrollObject = new HashMap<String, String>();
scrollObject.put("element", parentID);
scrollObject.put("name", "isConnected");
driver.executeScript("mobile:scroll", scrollObject);
}
这是尝试使用 scrollTo 的测试,但 Java 客户端无法识别 scrollTo(这是 Java 还是 Javascript 方法)。我也尝试过在谷歌中找到的所有其他方法,但无法弄清楚。
- 任何人都可以告诉我关于我无法单击未显示的单元格的结论是否正确?
- 如果是这样,请帮助如何滚动到我需要单击的单元格。
谢谢。
解决方案
您不能单击屏幕中未显示的元素。
您需要先滚动到该元素,然后才能单击该元素。您可以以各种方式滚动。您可以使用坐标滚动。您还可以使用 text、id、cont-desc 等滚动。
使用坐标滑动屏幕
import io.appium.java_client.TouchAction;
import io.appium.java_client.touch.WaitOptions;
import io.appium.java_client.touch.offset.PointOption;
import java.util.concurrent.TimeUnit;
import static java.time.Duration.ofSeconds;
TouchAction action = new TouchAction(driver);
action.press(PointOption.point(115, 650)).waitAction(WaitOptions.waitOptions(ofSeconds(1)))
.moveTo(PointOption.point(115, 350)).release().perform();
使用 cont-desc 滚动屏幕
public static MobileElement scrollElementByContentDesc(String scrollableList, String uiClassSelector, String contentDesc) {
return driver.findElement(MobileBy.AndroidUIAutomator(
"new UiScrollable(new UiSelector().resourceId(\"" + scrollableList + "\"))" +
".getChildByDescription(new UiSelector().className(\"" + uiClassSelector + "\"), \"" + contentDesc + "\")"));
}
有关 appium 滚动策略的更多信息,请遵循本教程
推荐阅读
- google-sheets - 有没有办法执行 VLookup 或类似的函数来返回最后一个值?
- image - Flutter 中的图像尺寸
- google-apps-script - 从另一个具有固定列和可变行的工作表中获取单元格的值
- apache-spark-sql - 使用 PySpark 展平层次结构表
- c - 如何在 C 中初始化结构?
- java - Java XML - 在新元素中添加现有元素
- node.js - Docker NodeJS 运行 pulseaudio --system 无法打开 cookie 文件
- vim - gnome-terminal 上的修补电力线字体不起作用(archlinux + GNOME)
- c - regexec 不排除字符
- javascript - JavaScript 中“new Date”的奇怪行为