无法使用 UiScrollable 和 TouchActions 在 Appium 中水平滚动
Unable to scroll Horizontally in Appium using UiScrollable and TouchActions
我正在尝试滚动到 Make My Trip 主页上的礼品卡选项,然后单击它。到目前为止,我已经尝试了以下两种方法但没有成功。附上App首页截图,方便理解。
方法 1:使用 AndroidUIAutomator 滚动到特定元素。
driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()"
+ ".resourceId(\"com.makemytrip:id/rvHomePageIcon\"))"
+ ".scrollIntoView(new UiSelector().textMatches(\"Gift Cards\")"
+ ".instance(0));"));
结果:这不会滚动,但会点击应用程序上的寄宿家庭选项。
方法二:
WebElement eleOne = driver.findElement(By.xpath("//*[@text='Flights']"));
WebElement eleTwo = driver.findElement(By.xpath("//*[@text='Gift Cards']"));
TouchAction t = new TouchAction(driver);
t.longPress(longPressOptions().withElement(element(eleOne))
.withDuration(ofSeconds(8))).moveTo(element(eleTwo))
.release().perform();
结果:抛出“找不到此类元素”异常,因为 eleTwo 当前不在框架中。我尝试调整这种方法并输入 eleTwo 作为在屏幕上可见的元素,只是为了查看滚动是否有效并且它确实有效。
但不知何故,我不确定如何处理屏幕上不可见的元素。
我想滚动顶部选项列表,然后单击顶部小部件菜单上的最后一个选项 GiftCard。
我正在将 AppiumDriver 与 Java-Client 7.3.0 一起使用。
你可以试试这个,使用 uiAutomator2(将 scrollable 设置为 true):
public void scrollByID(String Id, int index) {
try {
driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().resourceId(\""+Id+"\").instance("+index+"));"));
} catch (Exception e) {
e.printStackTrace();
}
}
您可以使用触摸操作根据屏幕尺寸水平和垂直滚动。这是示例代码。
public void scrollHorizontally() {
int y = driver.manage().window().getSize().height / 2;
int start_x = (int) (driver.manage().window().getSize().width * 0.2);
int end_x = (int) (driver.manage().window().getSize().width * 0.8);
TouchAction dragNDrop = new TouchAction(driver)
.press(PointOption.point(start_x, y)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(500)))
.moveTo(PointOption.point(end_x, y))
.release();
dragNDrop.perform();
}
我已经写了一个详细的答案来滚动不同的方法。您可以在这里查看:
我正在尝试滚动到 Make My Trip 主页上的礼品卡选项,然后单击它。到目前为止,我已经尝试了以下两种方法但没有成功。附上App首页截图,方便理解。
方法 1:使用 AndroidUIAutomator 滚动到特定元素。
driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector()"
+ ".resourceId(\"com.makemytrip:id/rvHomePageIcon\"))"
+ ".scrollIntoView(new UiSelector().textMatches(\"Gift Cards\")"
+ ".instance(0));"));
结果:这不会滚动,但会点击应用程序上的寄宿家庭选项。
方法二:
WebElement eleOne = driver.findElement(By.xpath("//*[@text='Flights']"));
WebElement eleTwo = driver.findElement(By.xpath("//*[@text='Gift Cards']"));
TouchAction t = new TouchAction(driver);
t.longPress(longPressOptions().withElement(element(eleOne))
.withDuration(ofSeconds(8))).moveTo(element(eleTwo))
.release().perform();
结果:抛出“找不到此类元素”异常,因为 eleTwo 当前不在框架中。我尝试调整这种方法并输入 eleTwo 作为在屏幕上可见的元素,只是为了查看滚动是否有效并且它确实有效。 但不知何故,我不确定如何处理屏幕上不可见的元素。
我想滚动顶部选项列表,然后单击顶部小部件菜单上的最后一个选项 GiftCard。
我正在将 AppiumDriver 与 Java-Client 7.3.0 一起使用。
你可以试试这个,使用 uiAutomator2(将 scrollable 设置为 true):
public void scrollByID(String Id, int index) {
try {
driver.findElement(MobileBy.AndroidUIAutomator("new UiScrollable(new UiSelector().scrollable(true).instance(0)).scrollIntoView(new UiSelector().resourceId(\""+Id+"\").instance("+index+"));"));
} catch (Exception e) {
e.printStackTrace();
}
}
您可以使用触摸操作根据屏幕尺寸水平和垂直滚动。这是示例代码。
public void scrollHorizontally() {
int y = driver.manage().window().getSize().height / 2;
int start_x = (int) (driver.manage().window().getSize().width * 0.2);
int end_x = (int) (driver.manage().window().getSize().width * 0.8);
TouchAction dragNDrop = new TouchAction(driver)
.press(PointOption.point(start_x, y)).waitAction(WaitOptions.waitOptions(Duration.ofMillis(500)))
.moveTo(PointOption.point(end_x, y))
.release();
dragNDrop.perform();
}
我已经写了一个详细的答案来滚动不同的方法。您可以在这里查看: