Стратегия локатора 'name' не поддерживается для этого сеанса в Appium с моделью Cucumber и Page Objects - PullRequest
0 голосов
/ 10 апреля 2019

Я не могу заставить мой код работать ... Я использую Appium с TestNG и Cucumber

Это мой Base.java

public class Base {
    public AndroidDriver driver;
   }

Это мой Hooks.java

public class Hooks extends Base{

    private Base base;
    public Hooks (Base base) {
        this.base = base;
    }

    @Before("@homeScreenTest")
    public void init() throws MalformedURLException {

        DesiredCapabilities cap = new DesiredCapabilities();
        cap.setCapability("no",true);
        cap.setCapability(MobileCapabilityType.DEVICE_NAME, "Android Emulator");
        cap.setCapability("platformVersion", "9");
        cap.setCapability("platformName", "Android");
        cap.setCapability(MobileCapabilityType.NEW_COMMAND_TIMEOUT, "60");
        cap.setCapability("noRest", true);
        cap.setCapability("autoGrantPermissions",true);
        cap.setCapability("appPackage","myPackage");
        cap.setCapability("appWaitActivity", "myActivity");

        File f = new File("src");
        File fs = new File(f, "app");

        cap.setCapability(MobileCapabilityType.APP, fs.getAbsolutePath());
        base.driver = new AndroidDriver<WebElement>(new URL("http://127.0.0.1:4723/wd/hub"), cap);
        base.driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);
    }
}

Это мой объект класса страницы LanguageSelect.java

public class LanguageSelect extends Base{

    public Base base;

    public LanguageSelect (Base base) {
       super();
       this.base= base;
       PageFactory.initElements(base.driver,this);
    }

    @AndroidFindBy(xpath = "//android.widget.Button[@text='SET LANGUAGE']")
    public WebElement setLanguage;
}

И, наконец, это мой файл определения шага LandingScreenTest.java

public class LandingScreenTest extends Base{

    private Base base;
    public LandingScreenTest(Base base){
        this.base = base;
    }
@Then("^I click on button $")
        public void i_click_on_something(String strArg1) throws Throwable {

        LanguageSelect ls = new LanguageSelect(base);
        ls.setLanguage.click();
        }
}

Теперь кнопка вообще не щелкает, она есть, она видна, и если я напишу это в LandingScreenTest.java, она будет работать

WebElement setLng = base.driver.findElementByXPath("//android.widget.Button[@text='SET LANGUAGE']");
        setLng.click();

Но если я попробую с объектами страницы, я получу

"org.openqa.selenium.InvalidSelectorException: Locator Strategy 'name' is not supported for this session"

Иногда даже не драйвер не инициализируется. Я перебрал весь стекопоток и массу учебников, но просто не могу понять, как это правильно.

Причина, по которой я держу код в Base.java отдельно от кода в Hooks.java, заключается в том, что Cucumber не позволяет мне расширять классы аннотациями.

Что мне не хватает? Пожалуйста, помогите

Примечание: я не опубликовал ни класс бегуна, ни файл объектов, все работает, кроме случаев, когда я пытаюсь получить объекты из класса объектов страницы.

1 Ответ

0 голосов
/ 11 апреля 2019

Мне удалось это сработать. Так что в основном в классе LanguageSelect вместо

public class LanguageSelect extends Base{

    public Base base;

    public LanguageSelect (Base base) {
       super();
       this.base= base;
       PageFactory.initElements(base.driver,this);
    }

Я написал это


public class LanguageSelect extends Base{

    public LanguageSelect (AndroidDriver driver) {
       this.driver = driver;
       PageFactory.initElements(new AppiumFieldDecorator(driver),this);
    }

И это прекрасно работает, все остальное в других классах точно так же

...