В настоящее время я занимаюсь автоматизацией UWP приложения с использованием WinAppDriver/Appium и Selenium WebDriver. У меня возникла проблема с получением атрибута значения для текстового поля. Я пытался получить Legacy Value, а также Value.Value, но они возвращают null.
WinAppDriverLog:
[4ac9e28c][WindowsDriver@c6ac] Совпало '/session/4ac9e28c-e3c9-4a17-bd9a-d1657e8b3c01/element/42.591224.4.5.1.3785/attribute/LegacyValue' с командой 'getAttribute'
[4ac9e28c][WindowsDriver@c6ac] Прокси [GET /session/4ac9e28c-e3c9-4a17-bd9a-d1657e8b3c01/element/42.591224.4.5.1.3785/attribute/LegacyValue] к [GET http://127.0.0.1:4724/wd/hub/session/627D1077-ED95-4D32-BB9B-B1473EEF5817/element/42.591224.4.5.1.3785/attribute/LegacyValue] без тела
[4ac9e28c][WindowsDriver@c6ac] ==========================================
GET /wd/hub/session/627D1077-ED95-4D32-BB9B-B1473EEF5817/element/42.591224.4.5.1.3785/attribute/LegacyValue HTTP/1.1
Accept: application/json, */*
Accept-Encoding: gzip, compress, deflate, br
Connection: keep-alive
Content-Type: application/json; charset=utf-8
Host: 127.0.0.1:4724
User-Agent: appium
[4ac9e28c][WindowsDriver@c6ac] HTTP/1.1 200 OK
Content-Length: 76
Content-Type: application/json
{"sessionId":"627D1077-ED95-4D32-BB9B-B1473EEF5817","status":0,"value":null}
TestCode:
public void verifyValueByName(String locator, String expected) {
WebElement text = WinDriver.driver.findElementByName(locator);
Log.info("Проверка текста " + expected + "....");
Assert.assertEquals(text.getAttribute("LegacyValue"), expected); //Legacy|Accessible.Value
Log.info("ОЖИДАЕМОЕ ЗНАЧЕНИЕ: " + expected + " ФАКТИЧЕСКОЕ ЗНАЧЕНИЕ: " + text.getAttribute("Value.Value"));
}
Код WinDriver
public class WinDriver {
public static WindowsDriver<RemoteWebElement> driver = null;
public static void start(String appPath)
{
Log.info("Настройка");
DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.setCapability("automationName", "Windows");
capabilities.setCapability("app", appPath);
capabilities.setCapability("platformName", "Windows");
capabilities.setCapability("deviceName", "WindowsMachine");
try {
driver = new WindowsDriver<>(new URL("http://127.0.0.1:4723"), capabilities);
} catch (MalformedURLException e) {
throw new RuntimeException(e);
}
}
Меня это запутывает, так как я пробовал получить “LegacyName” (как было предложено здесь>> https://github.com/microsoft/WinAppDriver/blob/a6f3d7bca447e0c13a33f76454600c1fe737ab10/Tests/WebDriverAPI/ElementAttribute.cs#L46%5C%5C\>и это сработало, но, к сожалению, “LegacyValue” или “Value.Value” не работают.
Спасибо всем заранее!!!
Я пытался получить значение, используя WebElement.getAttribute(“Value.Value”) и WebElement.getAttribute(“LegacyValue”). Я ожидал получить значение с помощью getAttribute.
Ответ
Для решения проблемы с получением атрибута значения текстового поля в UWP приложении с использованием WinAppDriver и Appium, вам следует обратить внимание на несколько важных моментов, которые могут помочь разобраться с вашей ситуацией.
1. Проверка доступности элемента
Прежде всего, убедитесь, что вы корректно находите элемент. Проверьте с помощью метода isDisplayed()
, доступен ли элемент для взаимодействия:
WebElement text = WinDriver.driver.findElementByName(locator);
if (text.isDisplayed()) {
Log.info("Элемент видим.");
} else {
Log.error("Элемент не видим.");
}
2. Использование правильных атрибутов
Как вы уже отметили, атрибут LegacyValue
или Value.Value
могут не возвращать значение. Вместо этого попробуйте использовать другие доступные атрибуты, такие как Name
или AutomationId
, в зависимости от вашей конкретной реализации приложения.
Попробуйте следующий код:
String actualValue = text.getAttribute("Name"); // or another attribute that might hold the text
Log.info("Размещенное значение: " + actualValue);
Assert.assertEquals(actualValue, expected);
3. Обновление WinAppDriver
Убедитесь, что у вас установлена последняя версия WinAppDriver, так как иногда старые версии могут иметь баги, влияющие на работу с атрибутами.
4. Проверка WinAppDriver логов
Вы уже привели часть логов, где показано, что LegacyValue
возвращает null
. Это может указывать на то, что элемент, с которым вы работаете, может не поддерживать этот атрибут. Попробуйте вызывать методы, которые позволяют проверить доступные атрибуты или получать текст напрямую:
String elementText = text.getText(); // Попробуйте получить текст напрямую
Log.info("Полученный текст: " + elementText);
Assert.assertEquals(elementText, expected);
5. Использование различных методов
Если ничего из вышеперечисленного не сработало, попробуйте использовать методы, которые могут дать вам больше информации о элементе, например, getCssValue
, если это применимо.
Пример кода
Вот пример функции, которая всё объединяет:
public void verifyValueByName(String locator, String expected) {
WebElement text = WinDriver.driver.findElementByName(locator);
if (!text.isDisplayed()) {
Log.error("Элемент не видим.");
return;
}
String actualValue = text.getAttribute("Value.Value"); // Попробуйте другие атрибуты, если этот не работает
if (actualValue == null) {
actualValue = text.getAttribute("LegacyValue");
}
// Альтернативное получение текста
if (actualValue == null) {
actualValue = text.getText();
}
Log.info("Ожидаемое значение: " + expected + ", Полученное значение: " + actualValue);
Assert.assertEquals(actualValue, expected);
}
Заключение
Следуя приведённым рекомендациям, вы должны быть в состоянии устранить проблему с получением значения атрибута или же найти альтернативный подход к получению текста из текстового поля. Убедитесь, что вы тестируете свой код с последней версией инструментов, и при необходимости рассматривайте обновление вашего UWP приложения, так как это может повлиять на доступные атрибуты для элементов.