Невозможно идентифицировать элемент в 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);

Я правильно настраиваю возможности?

  1. Решение пробовал:
    1. Я проверил, используя возможность browserName как пустое / Safari, но не сработало
    2. Кроме того, я установил ios-webkit-debug-proxy и запустил прокси с помощью терминала в фоновом режиме на моем Mac
  2. Проблема в том, что я не могу определить элементы в 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 ответа

  1. Продолжение здесь: Как включить и использовать WebView для iOS Automation в Appium

Попробуйте использовать следующий код для переключения контекстов:

var contextNames = driver.GetContexts(); //correction to your code 
driver.SetContext(contextNames[1]);
  1. Вам не обязательно нужна следующая возможность при использовании appium:

    capabilities.SetCapability("browserName", "iOS"); //can be removed from code as well
    
  2. Я предполагаю, что вы, возможно, пытаетесь использовать 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

  1. Скопируйте эту ссылку в xcode: https://github.com/appium/ios-uicatalog

  2. Найдите репозиторий, в котором у нас установлен UICatalog.app Пользователи / Библиотека / Разработчик /Xcode/DerivedData/UICatalog-bhmtevqhmgarbcgnqybxttbkqfvn/Build/Products/Debug-iphonesimulator/UICatalog.app

  3. Скопируйте его в путь к приложению в настройках 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;

Я надеюсь, что это может помочь всем вам».

Другие вопросы по тегам