Я пытаюсь добавить метод в свой класс смахивания (как часть моего базового макета), где он будет пытаться определить, является ли нужный элемент видимым, основываясь на количестве попыток смахивания. Если во время поиска свайп встречается с краем (например, снизу веб-страницы (для WebView) / виджетом (для NativeView,), то он проводит пальцем в другом направлении, чтобы продолжить поиск.
Редактировать : я попытался решить эту проблему, создав два MobileElement, назначив один элемент с помощью: driver.switchTo().activeElement()
в качестве текущего представления, а второй MobileElement назначил в качестве предыдущего представления после каждого пролистывания. Однако, когда я достигаю нижней части веб-страницы / виджета, мой код показывает мне, что предыдущий и текущий вид не совпадают.
Из моих исследований по определению границ виджетов во время прокрутки, это было решением, которое другие предоставили без необходимости получать доступ к размерам браузера / виджета через класс View.
Я неправильно понимаю использование switchTo (). ActiveElement ()? Существуют ли альтернативы, помогающие решать индикаторы при достижении границы?
Я пытался выполнить отладку на Appium Server и искал поведение, при котором была достигнута граница, но журналы не показывают никакой информации из моих свайпов, когда она достигает края. (Тем не менее, поведение для прокрутки записывается.)
Редактировать: В своих тестах я использовал Результаты поиска Google в качестве объекта для проверки, если обнаружена граница. AutomationName при настройке моего AppiumDriver - UIAutomator2.
Вот фрагменты кода, которые определяют мой класс смахивания:
Сам метод смахивания:
void swipeVertical(double startPercentage, double finalPercentage, int duration) {
driver.context(nativeContext);
size = driver.manage().window().getSize();
int width = (int) (size.width/2);
int startPoint = (int) (size.getHeight() * startPercentage);
int endPoint = (int) (size.getHeight() * finalPercentage);
new AndroidTouchAction(driver)
.press(PointOption.point(width, startPoint))
.waitAction(WaitOptions.waitOptions(Duration.ofMillis(duration)))
.moveTo(PointOption.point(width, endPoint))
.release()
.perform();
driver.context(defaultContext);
}
Редактировать : Это метод, в котором я планирую включить другой метод в цикл while, чтобы проверить, видна ли в настоящее время веб-страница / виджет: (Я предпринял попытки сделать сравнение с помощью toString () , toJson (), hashCodes () и getLocation (). Ни одно из этих решений до сих пор не работало для обнаружения изменений вида при свипах.
void swipeUntilFound(By method, int attempts, MobileElement targetElement) {
int limitCount = 0;
double startScrollPoint = 0.8;
double endScrollPoint = 0.25;
MobileElement lastViewPoint = null;
MobileElement currentViewPoint;
int lastViewPointPosition = 0;
while (limitCount < attempts || driver.findElements(method).isEmpty()) {
if(lastViewPoint != null) {
lastViewPointPosition = lastViewPoint.getLocation().getY();
}
swipeVertical(startScrollPoint, endScrollPoint, 3000);
currentViewPoint = (MobileElement) driver.switchTo().activeElement();
try {
System.out.println("last Element in View: " + lastViewPoint.hashCode() + "Location: " + lastViewPoint.getLocation());
System.out.println("Current Element in View: " + currentViewPoint.hashCode() + "Location: " + currentViewPoint.getLocation());
}
catch (NullPointerException e) {
}
if(lastViewPoint == null || lastViewPoint.hashCode() != currentViewPoint.hashCode()) {
System.out.println("Last and Current don't match.");
lastViewPoint = currentViewPoint;
}
else if( lastViewPointPosition == lastViewPoint.getLocation().getY() ||
lastViewPoint.hashCode() == currentViewPoint.hashCode()) {
System.out.println("Last and Current match");
double temp = startScrollPoint;
startScrollPoint = endScrollPoint;
endScrollPoint = temp;
}
limitCount++;
}
if(limitCount == attempts) {
System.out.println("Unable to find Specified Element.");
}else {
targetElement = driver.findElement(method);
System.out.println("Element " + method.toString() + " was found.");
}
}