Невозможно идентифицировать элемент в WEBVIEW в iOS-приложении для автоматизации Hyrid с помощью Appium на реальном устройстве.
Я пытался автоматизировать сборку гибридного приложения, используя ionic2/Angular2 и машинопись.
Я использую C# для написания кода. тест в BDD - specflow Версии: iOS:9.3.1 Xcode: 7.3 Appium: 1.4.13
Я не могу определить элементы после переключения контекста в WEBVIEW.
Вызов IOSDriver с помощью кода ниже
private IOSDriver<IOSElement> driver = null;
public IOSDriver<IOSElement> GetDriver(string platformVersion, string deviceName, string udid ,string appPath, string serverUri)
{
Capabilities iosCapabilities = new Capabilities();
DesiredCapabilities capabilities = iosCapabilities.Get(platformVersion, deviceName, udid, appPath);
driver = new IOSDriver<IOSElement>(new Uri(serverUri), capabilities, TimeSpan.FromSeconds(Constants.DriverWaitTime));
driver.Manage ().Timeouts ().ImplicitlyWait (TimeSpan.FromSeconds(Constants.ImplicitWaitTime));
var contextNames = driver.Contexts;
driver.Context = contextNames[1];
driver.FindElement(By.Xpath(locator)).Click();
}
Установка возможностей как
private DesiredCapabilities capabilities = new DesiredCapabilities();
capabilities.SetCapability ("appium-version", Constants.AppiumVersion);
capabilities.SetCapability ("platformName", Constants.PlatformName);
capabilities.SetCapability("autoWebView", "true");
capabilities.SetCapability("browserName", "iOS");
capabilities.SetCapability ("platformVersion", Constants.PlatformVersion);
capabilities.SetCapability("deviceName", deviceName);
capabilities.SetCapability("app", appPath);
capabilities.SetCapability("udid", udid);
Я правильно настраиваю возможности?
- Решение пробовал:
- Я проверил, используя возможность browserName как пустое / Safari, но не сработало
- Кроме того, я установил ios-webkit-debug-proxy и запустил прокси с помощью терминала в фоновом режиме на моем Mac
- Проблема в том, что я не могу определить элементы в WEBVIEW.
Что я делаю
После запуска приложения в appium inspector я вижу все элементы и пытаюсь нажать на текстовое поле, чтобы ввести какое-то значение
Xpath текстового поля (как я могу видеть в окне инспектора Appium): "// UIAApplication 1/ UIAWindow 1/ UIAScrollView 2/ UIAWebView 1/ UIATextField 1"
var contextNames = driver.Contexts
дает мне список представлений (в моем случае 2 представления: NATIVE_APP, WEBVIEW_1) Контекст WebView динамически обновляется с 1,2,3 и т. д.
Как только я позвоню
diver.Context=contextNames[1]; //setting context to WEBVIEW
и обновить инспектор Appium Я не могу увидеть / определить ни одного элемента. Все исчезает.
Почему я не могу видеть / идентифицировать элементы после перехода на веб-просмотр. (Примечание: как только я переключаюсь обратно на driver.Context="NATIVE_APP", каждый элемент становится видимым в Инспекторе приложений, но я все равно не могу нажать)
Это показывает ошибку как "Элемент не может быть найден, используя данный параметр поиска"
Вручную также, когда я пытаюсь нажать или отправить ключи с помощью инспектора приложений, это не позволяет мне сделать это (после запуска приложения вручную с помощью кнопки инспектора). В чем проблема здесь. Помощь будет высоко ценится
Снимок экрана инспектора Appium:
Сообщение об ошибке, отображаемое в окне приложения:
Вот полные журналы Appium(ОШИБКА)
Ссылка журналов Appium, когда не удается идентифицировать элементы в WEBVIEW
4 ответа
- Продолжение здесь: Как включить и использовать WebView для iOS Automation в Appium
Попробуйте использовать следующий код для переключения контекстов:
var contextNames = driver.GetContexts(); //correction to your code
driver.SetContext(contextNames[1]);
Вам не обязательно нужна следующая возможность при использовании appium:
capabilities.SetCapability("browserName", "iOS"); //can be removed from code as well
Я предполагаю, что вы, возможно, пытаетесь использовать Appium Inspector вместе с запуском / отладкой ваших тестов. В этом случае вы не сможете использовать оба экземпляра. Пожалуйста, просмотрите журналы сервера Appium для подробностей об этом.
1) При доступе к ios webview - используя getcontextHandles, мы можем достичь
Установить contextNames = idriver.getContextHandles ();
System.out.println(contextNames);
for (String contextName : contextNames) {
if (contextName.contains("NATIVE_APP")) {
Reporter.log("Reaching to Native App", true);
idriver.context(contextName);
sleepfor(1000);
idriver.findElementByName("Open").click();
Reporter.log("Clicking Open to naviagte to Native APP", true);
}
else{
Reporter.log("Not found", true);
}
}
2) Если вышеуказанный контекст не работает - попробуйте запустить iproxy, запустите его в терминале - ios_webkit_debug_proxy -c deviceID:27753 -d deviceID - чтобы получить идентификатор устройства (инструменты -s устройства)
Я думаю, что вы должны настроить UICatalog в Appium
Скопируйте эту ссылку в xcode: https://github.com/appium/ios-uicatalog
Найдите репозиторий, в котором у нас установлен UICatalog.app Пользователи / Библиотека / Разработчик /Xcode/DerivedData/UICatalog-bhmtevqhmgarbcgnqybxttbkqfvn/Build/Products/Debug-iphonesimulator/UICatalog.app
- Скопируйте его в путь к приложению в настройках Appium ios
«Привет, я также столкнулся с той же проблемой при нажатии на поле в гибридном приложении iOS. Я пробовал разные подходы, такие как TouchAction, Action и т. д.
После тщательной отладки кода я обнаружил, что изменение контекста было выполнено успешно, но действие щелчка не выполнялось. Затем исполнение перешло к следующему этапу. Итак, я попытался изменить локатор WebElement. Хотя предыдущий локатор работал для Android и mWeb, я обнаружил, что один из моих локаторов CSS работает для щелчка по полю.
Впоследствии я попробовал добавить локаторы CSS для других веб-элементов, и мой сценарий работал нормально.
Примечание. Попробуйте использовать относительные локаторы CSS, например, tagName[attribute='value'], div[class='bold-text'].
@FindAll({
@FindBy(css = "div[css='2']"),
@FindBy(xpath = "//*[@class=\"label-container return--location\"]//*[@class=\"airport-info--code\"]")
})
private WebElement dropOffCityCode;
Я надеюсь, что это может помочь всем вам».