Как использовать функции / методы, для которых требуется параметр «драйвер» в модели фабрики страниц - PullRequest
0 голосов
/ 10 октября 2019

В моем фреймворке у меня есть класс baseTest и класс BasePageObject. Каждая страница расширяет BasePO. Дело в том, что многие мои методы на страницах должны использовать экземпляр драйвера. У меня есть метод getDriver(), и я использую его 'n' раз на каждой странице. Это приводит к тому, что Appium вызывает getSession 120 раз за 5-минутную сессию, потому что я использую явное ожидание (см. Код):

[debug] [MJSONWP (ae82d29b)] Calling AppiumDriver.getSession() with args: ["ae82d29b-c0af-46f9-bb13-d6ecc8ff5a00"]
2019-10-10 03:22:45:681 - [debug] [XCUITest] Executing command 'getSession'

Как решить эту проблему?

Я не уверен, что попробовать, не меняя всю структуру

public class BasePO {

    WaitUtils waitUtils;
    AssertionUtils asrt;
    public BasePO() {
        asrt = new AssertionUtils();
        waitUtils = new WaitUtils();
        loadProperties();
        initElements();
    }
     private void initElements() {

        PageFactory.initElements(new AppiumFieldDecorator(getDriver()), this);
    }
    private void loadProperties() {

    }

    protected IOSDriver<IOSElement> getDriver() {
        return IOSDriverManager.getThreadLocalDriver();
    }
}

Driver Manager

public class IOSDriverManager {
    public static ThreadLocal<IOSDriver<IOSElement>> webDriver = new ThreadLocal<IOSDriver<IOSElement>>();

    public static DesiredCapabilities getIOSCaps() {
     Here Are my Caps
    }

    public static IOSDriver<IOSElement> getThreadLocalDriver() {
        IOSDriver<IOSElement> driver = webDriver.get();
        if (driver == null) {
            createThreadLocalWebDriver();
            driver = webDriver.get();
        }
        return driver;
    }

    public static void createThreadLocalWebDriver() {
        IOSDriver<IOSElement> driver = null;
             try {
                driver = new IOSDriver<IOSElement>(new URL("http://" + getProperty("accessUser") + ":" + getProperty("accessKey") + "@hub-cloud.browserstack.com/wd/hub"), getIOSCaps());
            } catch (Exception e) {
                try {
                    driver = new IOSDriver<IOSElement>(new URL("http://" + getProperty("accessUser") + ":" + getProperty("accessKey") + "@hub-cloud.browserstack.com/wd/hub"), getIOSCaps());
                } catch (MalformedURLException e1) {
                    System.out.println("IOS Driver is not created..!, Please check capabilitis or make sure Appium Server is running.");
                }
                return;
            }


        webDriver.set(driver);
    }

Любая страница

public class dashboardPage extends BasePO {

    @iOSXCUITFindBy( id = "dashboardScreen")
    private MobileElement dashboardScreen;

  public boolean isDashboardScreen(){
        waitUtils.waitForElementToBeVisible(dashboardScreen, getDriver());
        boolean flag =dashboardScreen.isDisplayed();
        return flag;
    }

Может ли быть меньше вызовов getSession без сокращения количества явных ожиданий?

Ответы [ 2 ]

0 голосов
/ 11 октября 2019

Попробуйте использовать методы инициализации фабрики страниц, как это. Для каждой страницы пользовательского интерфейса используйте отдельный класс, а затем используйте конструктор страниц в конструкторе.

public class MainPage {
 IOSDriver<IOSElement> driver;

//constructor to initialize MainPage Class with IOSDriver with pageFactory design pattern
ProgrammesPage prog_page;
public MainPage(IOSDriver<IOSElement> driver) {
       this.driver = driver;
      // PageFactory.initElements(new AppiumFieldDecorator(driver), this);
       PageFactory.initElements(new AppiumFieldDecorator(driver), this);
   }
}
0 голосов
/ 10 октября 2019

Я решил проблему в своей собственной среде, добавив экземпляр protected WebDriver и конструктор protected в BasePageObject, который назначает экземпляр WebDriver. Затем ваши другие PageObjects наследуются от BasePageObject, и вы можете реализовать другой конструктор для PageObject, который принимает WebDriver в качестве аргумента.

Когда вы инициализируете PageObjects, вы можете передать экземпляр WebDriver вашего тестового примера в PageObject, чтобы вы моглине нужно будет звонить getDriver() все время. Вы можете использовать этот экземпляр WebDriver для выполнения действий с вашими PageObjects, а затем ваши тестовые примеры могут вызывать методы PageObject без каких-либо getDriver().

. Вот как выглядит мой фреймворк в C #, начиная с BasePageObject:

public class BasePageObject
{
    // protected WebDriver instance
    protected IOSDriver<IOSElement> Driver { get; }

    protected BasePageObject(IOSDriver<IOSElement> driver)
    {
        Driver = driver;
    }

Затем обычный PageObject обозначается SomePageObject:

// inherit from BasePageObject
public class SomePageObject : BasePageObject
{
    // implement protected constructor from BasePageObject
    public SomePageObject(IOSDriver<IOSElement> driver) : base(driver)
    {
    }

    // we can use the PageObject's driver instance as such
    public void DoSomethingWithDriver()
    {
        // this is protected WebDriver instance from BasePageObject above
        Driver.FindElement(SomeLocator);
    }
}

Теперь, связав все это вместе, вот как это выглядит в тестовом примере:

public class MyTestClass
{
    // initialize your driver somehow
    IOSDriver<IOSElement> driver = getThreadLocalDriver();

    // declare your PageObject, passing in your Driver instance
    SomePageObject myPageObject = new SomePageObject(driver);

    // now you can call PageObject methods as such
    myPageObject.DoSomethingWithDriver();
}

Это все очень обобщенно, и его нужно будет модифицировать в соответствии с вашими потребностями, но это шаблон проектирования, который я использовал во всех моих тестовых средах с хорошими результатами.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...