java - 滚动到不在屏幕上且具有共享对象 ID 但具有唯一用户确定文本的元素(Android / Java)
问题描述
我正在尝试导航到与其他对象共享相同 ID 但具有不同文本的元素(并单击)。其中一些元素,取决于其他变量,可能会或可能不会出现在屏幕上。在我的设备上,滚动有效,但在某些设备或模拟器上,它并不总是有效。请建议我临时滚动的替代方法,因为我有点不知道该怎么做。
我正在使用 2018 年 7 月 11 日构建的 IntelliJ IDEA Community 2018.1 Build #IC-181.5540.7
JRE:1.8.0_152-release-1136-b39 amd64
JVM OpenJDK 64 位服务器虚拟机
public static void environment(AndroidDriver driver, String environmentName, String configStatus, String deviceType, String configName) {
List elementsFilterPage = driver.findElements(By.id("com.digiflare.videa:id/filter_item_text"));
System.out.println("There is this much Environment config file elements = " + elementsFilterPage.size()); // THIS IS TO SELECT THE ENVIRONMENT OF THE CONFIG FILE. MAKE SURE TO CHANGE THE "Staging" TO SUIT YOUR NEEDS
for (int i = 0; i < elementsFilterPage.size(); i++) {
MobileElement element = (MobileElement) elementsFilterPage.get(i);
if (element.getText().equals(environmentName)) {
element.click();
break;
}
TouchAction ta = new TouchAction(driver); // ONLY NEEDED TO BE ABLE TO ACCESS THE OTHER ELEMENTS FILTER PAGE. MIGHT NEED TO EDIT IF YOU HAVE LOTS OF ELEMENTS ON PAGE TO ACCESS BRANDS, STATUS, ETC
ta.press(point(962, 1329))
.moveTo(point(962, 345))
.waitAction(waitOptions(Duration.ofMillis(3000)))
.release()
.perform();
}
System.out.println("There is this much Status config file elements = " + elementsFilterPage.size()); // THIS IS TO SELECT THE STATUS OF THE CONFIG FILE MAKE SURE TO CHANGE THE "Published" TO SUIT YOUR NEEDS
for (int i = 0; i < elementsFilterPage.size(); i++) {
MobileElement element = (MobileElement) elementsFilterPage.get(i);
if (element.getText().equals(configStatus)) {
element.click();
break;
}
}
System.out.println("There is this much Phone config file elements = " + elementsFilterPage.size()); // THIS IS TO SELECT THE DEVICE TYPE OF THE CONFIG FILE EDIT VARIABLE TO SUIT YOUR NEEDS
for (int i = 0; i < elementsFilterPage.size(); i++) {
MobileElement element = (MobileElement) elementsFilterPage.get(i);
if (element.getText().equals(deviceType)) {
element.click();
break;
}
}
WebElement doneButton = driver.findElementById("com.digiflare.videa:id/edition_done_menu_item");
doneButton.click();
Utils.waitForPresence(driver, 6, "com.digiflare.videa:id/edition_name");
List elementsConfigFilesPage = driver.findElements(By.id("com.digiflare.videa:id/edition_name"));
System.out.println("There is this much Config Files elements = " + elementsConfigFilesPage.size());
for (int i = 0; i < elementsConfigFilesPage.size(); i++) {
MobileElement element = (MobileElement) elementsConfigFilesPage.get(i);
if (element.getText().equals(configName)) { // THIS IS WHERE YOU'LL BE ABLE TO ENTER THE LATEST PUBLISHED / TO BE TESTED CONFIG FILE. EDIT VARIABLE TO SUIT YOUR NEEDS
element.click();
break;
}
}
}
解决方案
因此,经过我自己的一些搜索,我找到了以下解决方案。我创建了一个方法,它会滚动屏幕直到找到指定的文本并单击它。这是为那些可能与我遇到相同问题的人准备的:
public static void scrollclickText (AndroidDriver driver, String visibleText){
driver.findElementByAndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().textContains(\""+visibleText+"\").instance(0))").click();
推荐阅读
- java - 在 java 中运行 .bat 文件以创建 .csv 文件
- javascript - 在 Typescript 编译期间在相对导入语句上附加 .js 扩展名(ES6 模块)
- fortran - 调用一个子程序,该子程序调用一个固定的二变量函数
- angular - 升级到 Angular 10 后无法在 scss 中使用 url() 中的资产
- javascript - Vue组件中的条件导入
- python - 追加到空列表
- flutter - 如何不在网格视图中显示当前用户?
- sql - 如何在 SQL Server 2012 中将逗号分隔的变量值转换为行?
- python - 检查数据框中的列是否包含列表中的任何单词+添加计数(Python)
- azure - 无法通过邮递员中的 Microsoft Graph API 获取消息