#appium-ios #page-factory
#appium-ios #страница-фабрика
Вопрос:
Мы автоматизируем приложение для iOS, созданное на основе react, с помощью Appium. Мы используем шаблон проектирования PageFactory. Для щелчка по элементу я использую этот код:
- Ожидание, пока элемент станет видимым.
- Щелчок по элементу
public Boolean waitUntilVisible(WebElement element)
{
try {
wait.until(ExpectedConditions.visibilityOf(element));
return true;
}catch (Exception e)
{}
return false;
}
public boolean click(WebElement element)
{
//Click on the element and return true if successful and false if unsuccessful.
try
{
waitUntilVisible(element);
element.click();
} catch (Exception e) {}
return false;
}
Общее выполнение, похоже, занимает слишком много времени. Насколько я понимаю, waitUntilVisible ожидает, пока значение isDisplayed() элемента станет true.
Поскольку мы используем PageFactory, я предполагаю, что идентификация элемента происходит дважды.
1. Сначала элемент будет идентифицирован перед проверкой видимости.
2. Тот же элемент будет идентифицирован снова перед щелчком мыши.
Поскольку мы используем xpath во многих областях, идентификация элемента обычно занимает больше времени. При простом нажатии один и тот же элемент идентифицируется дважды, что еще больше увеличивает время.
Я хочу знать любое решение для сохранения идентифицированного элемента, чтобы он не тратил время на его повторную идентификацию.
Итак, я изменил свой код, как показано ниже:
public WebElement waitUntilVisible(WebElement element)
{
try {
return wait.until(ExpectedConditions.visibilityOf(element));
}catch (Exception e)
{}
return null;
}
public boolean click(WebElement element)
{
//Click on the element and return true if successful and false if unsuccessful.
try
{
WebElement remoteElement = waitUntilVisible(element);
remoteElement.click();
} catch (Exception e) {}
return false;
}
Этот метод, похоже, не экономит время.
Есть ли у меня какой-либо другой способ сократить время выполнения.
Примечание: Мы используем WebElement вместо IOSElement, так что тот же код, который использовался в автоматизации рабочего стола, может использоваться и в автоматизации IOS.
Ответ №1:
использование
mobileElement = driver.findElement(MobileBy.locator("locator"));
appiumDriverActions.moveToElement(mobileElement).click().perform();
appiumWait.until(ExpectedConditions.condition(Element/locator));
вместо
mobileElement = driver.findElement(MobileBy.locator("locator"));
mobileElement.click();
в некоторых случаях с новым VC по умолчанию из iOS13 лучше использовать moveToElement, а затем использовать action click вместо element.click();
для получения более подробной информации, https://medium.com/@ayman.ibrahim.mansour/appiums-best-way-to-deal-with-the-new-view-controller-presentation-in-ios-13-6d801fcc3cb
Комментарии:
1. Мой вопрос не касается проблемы с использованием action click. Речь идет о сравнении использования PageFactory и переменных By.
2. в том-то и дело, что на самом деле большую часть времени занимает не поведение PageFactory, а поведение команды click. на самом деле поведение PageFactory предпочтительнее, чтобы поддерживать передачу TC и избегать устаревания элементов
3. в этом методе
public boolean click(WebElement element)
вместо использованияelement.click();
попробуйте использоватьactions.moveToElement(element).click().perform();
это должно ускорить вашу автоматизацию, в случае iOS 13 и выше. изменение, которое вы сделали, только заменило PageFactory на чистый selenium, что не приведет к сокращению времени, поскольку PageFactory в любом случае не потребляет так много времени, то, что потребляет время, — этоelement.click()
само по себе