Стратегия локатора «селектор css» не поддерживается для этой проблемы сеанса с appium

Поскольку я новичок в мобильной автоматизации, я пытался выполнять простые действия, используя appium maven и eclipse. Но когда я пытаюсь запустить приложение «Калькулятор», оно открывается, но элементы недоступны.

Этот код я использовал для запуска простого калькулятора

  @BeforeClass
 public void setUp() throws MalformedURLException {

    DesiredCapabilities capabilities = new DesiredCapabilities();
    capabilities.setCapability("BROWSER_NAME", "Android");
    capabilities.setCapability("VERSION", "4.4.2");
    capabilities.setCapability("deviceName", "Emulator");
    capabilities.setCapability("platformName", "Android");

    capabilities.setCapability("appPackage", "com.android.calculator2");

    capabilities.setCapability("appActivity", "com.android.calculator2.Calculator");

    driver = new RemoteWebDriver(new URL("http://0.0.0.0:4723/wd/hub"), capabilities);
}

@Test
public void testCal() throws Exception {

    WebElement two = driver.findElement(By.name("2"));
    two.click();

}

@AfterClass
public void teardown() {

}

Я использую последние стабильные зависимости. io.appium java-клиент 7.0.0 и org.testng testng 6.14.3

FAILED: testCal
org.openqa.selenium.InvalidSelectorException: Locator Strategy 'css 
selector' is not supported for this session
For documentation on this error, please visit: 
https://www.seleniumhq.org/exceptions/invalid_selector_exception.html
Driver info: org.openqa.selenium.remote.RemoteWebDriver
Capabilities {BROWSER_NAME: Android, VERSION: 4.4.2, appActivity: 
com.android.calculator2.Cal..., appPackage: com.android.calculator2, 
databaseEnabled: false, desired: {BROWSER_NAME: Android, VERSION: 4.4.2, 
appActivity: com.android.calculator2.Cal..., appPackage: 
com.android.calculator2, deviceName: Emulator, platformName: android}, 
deviceManufacturer: HUAWEI, deviceModel: FLA-LX2, deviceName: 
HXT7N18521000819, deviceScreenSize: 1080x2160, deviceUDID: 
HXT7N18521000819, javascriptEnabled: true, locationContextEnabled: false, 
networkConnectionEnabled: true, platform: LINUX, platformName: LINUX, 
platformVersion: 8.0.0, takesScreenshot: true, warnings: {}, 
webStorageEnabled: false}
Session ID: a604a166-3c0d-4e9c-a3e4-9b1ea734bee6
*** Element info: {Using=name, value=2}
at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
at sun.reflect.NativeConstructorAccessorImpl.newInstance(Unknown Source)
at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(Unknown 
Source)
at java.lang.reflect.Constructor.newInstance(Unknown Source)
at...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
0
10 119
5

Ответы 5

Appium — это не Selenium: они оба реализованы с использованием проводного протокола JSON и имеют похожие API, но не одинаковые:

Поддерживаемые стратегии поиска для собственного приложения для Android:

  • id (атрибут представления resource-id);
  • accessbilityId (атрибут представления содержимого-описания);
  • uiAutomator (лучше почитать про селектор пользовательского интерфейса);
  • className (тип компонента пользовательского интерфейса);
  • XPath.

Таким образом, вы не можете использовать стратегию поиска By.name для сеанса драйвера Android, она не поддерживается.

Чтобы упростить задачу, я предлагаю использовать MobileBy вместо By в нативных тестах Appium: вы получите правильные варианты.

By.name("text") удаляется из Appium v1.5.0 и далее.

Также просто добавить cssSelector стратегию + такие методы, как getAttribute("color/background"), присутствующие в Selenium, не поддерживаются в Appium для нативных приложений, поскольку они не поддерживаются базовой структурой модульного тестирования Android, то есть UIAutomator.

Вы можете использовать следующие параметры для нажатия цифр калькулятора

driver.findElement(By.id(“com.android.calculator2:id/digit5”)).click();
driver.findElement(By.xpath(“//android.widget.Button[contains(@resource-id,'digit5') and @text='5']”)).click();
driver.findElementByAccessibilityId(“plus”).click();
driver.findElement(By.xpath(“//android.widget.Button[@text='5']”)).click();

Недавно я тоже столкнулся с этой проблемой. Если кто-то хочет знать, вот что я сделал, чтобы решить эту проблему.

  1. Обновлен java-клиент. Обновил до версии 7.2.0 в пом.
  2. Удалена зависимость selenium-java. Это необходимо удалить, так как java-клиент уже имеет зависимость от селена. Если его не удалить, это может вызвать конфликт.
  3. Обновите мой проект maven.
  4. Перезапустите тест. Я просто попытался нажать цифру 5 в приложении калькулятора с помощью эмулятора, и это сработало.

Если вы удалили зависимости selenium-java, то как вы использовали DesiredCapabilities? Не могли бы вы поделиться своим кодом, а также файлом pom.xml, пожалуйста?

Ananth Kamath 22.09.2021 11:19

Я попробовал этот подход 3 февраля 2020 года и смог успешно выполнить его. Изменение, которое я должен был сделать, это обновить io.appium до 7.2.0.

Предварительные условия в моем случае / тесте: компьютер с Windows, созданный Nexus S AVD, запущенный Appium и AVD.

Самое главное

URL url = new URL("http://127.0.0.1:4723/wd/hub");
driver = new AndroidDriver<MobileElement>(url, capabilities);
MobileElement two =(MobileElement)driver.findElement(By.id("com.android.calculator2:id/digit_9"));   
two.click();

Я пытаюсь протестировать приложение Hybrid Mobile, написанное с помощью Ionic. У вас есть предложения по этому поводу? Я попытался переключить контекст на Интернет, но я тоже застрял в этом.

Vasanth 07.02.2020 09:44

Всегда используйте имя класса и текстовое имя для создания xpath.

const loginbutton=await driver.$("//android.widget.TextView[@text='login']")


await loginbutton.click()

Драйвер исходит из возможностей

class name --> android.widget.TextView

text name -->login

поэтому всегда используйте имя класса и текстовое имя, чтобы создать лучший и приятный xpath.

работает на всех android+appium+wdio

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