Явное ожидание с использованием элементов фабрики страниц, ожидающих ответа в течение длительного времени - PullRequest
0 голосов
/ 26 мая 2018

Я создал один элемент, используя класс фабрики страниц.

@Findby(how=How.ID,using="userName")
private WebElement userName;

//Adding explicit wait here

WebDriverWait wait = new WebDriverWait(driver,30);
wait.until(ExpectedConditions.visibilityOf(userName)); // It is taking long time to wait even though the web element presents in the DOM

Если я использую оператор ниже, веб-драйвер немедленно реагирует, когда webelement присутствует в DOM.

wait.until(ExpectedConditions.visibilityOf(driver.findElement(By.id("userName")));

Та же проблемас другими явными методами ожидания.

Это мое наблюдение.Любая идея решить эту проблему поможет мне.Спасибо!

Ответы [ 3 ]

0 голосов
/ 26 мая 2018

Это объяснение, которое Вы предоставили, неясно, но я попытаюсь объяснить

// in top of class, enter code with annotations for init. webElementa
@FindBy(xpath = "//button[@id='...']")
private WebElement buttonBack;() 

... n elements ... 

// in constructor initElements() takes all elements and tries to find it and assign to variables above

public Page(WebDriver driver) {
    super(driver);
    PageFactory.initElements(driver, this);
    waitForScriptsToLoad(driver); // this will wait 30s to get 

}

и постараюсь дождаться загрузки Вашей страницы этим методом (ниже):

public static void waitForScriptsToLoad(WebDriver driver) {
    new org.openqa.selenium.support.ui.WebDriverWait(driver, 30).until((ExpectedCondition<Boolean>) wd ->
            ((JavascriptExecutor) wd).executeScript("return document.readyState").equals("complete"));
}

Этот метод ожидает, пока unitl complete DOM готов продолжить работу.Если Вам нравится, пожалуйста, проверьте эту ссылку: https://developer.mozilla.org/en-US/docs/Web/API/Document/readyState

Явное ожидание Вы помещаете места внутри методов или в конструктор, если Вы уверены, что ожидание всегда будет необходимо.

И дополнительная информацияо типах ожидания здесь: 1. Типы явного ожидания в веб-драйвере Selenium (Java)? 2. Заменить неявное ожидание явным ожиданием (selenium webdriver & java)

0 голосов
/ 28 мая 2018

Решение для устранения задержки заключается в использовании PageFactory в соответствии с назначением и наличии конструктора для вашего класса , гдеВы хотели бы инициализировать Явное ожидание , а также:

public class My_Page_Class {

    WebDriver driver;
    WebDriverWait wait; 

    //class constructor
    public Your_Page_Class(WebDriver driver)
    {
        this.driver = driver; 
        wait = new WebDriverWait(driver,10);
    }

    @Findby(how=How.ID,using="userName")
    private WebElement userName;

    // page class functions
    public void foo()
    {
        wait.until(ExpectedConditions.visibilityOf(userName));
        //other code works
    } 
}

Теперь из вашего аннотированного класса @Test вы можете инициализировать класс следующим образом:

@Test (priority=0)
public void checkValidUser()
{
    //Created Page Object using Page Factory
    My_Page_Class my_page_class = PageFactory.initElements(driver, My_Page_Class.class);

    //Call the method
    my_page_class.foo();

}

Соответствующее обсуждение вы найдете в Использование PageObjects, Page Factory и WebDriverWait в Selenium WebDriver с использованием Java

0 голосов
/ 26 мая 2018

Так запутался насчет этапа, когда вы пытаетесь найти элемент (до или после загрузки DOM).ExpectedConditions.visibilityOf (element) следует использовать только тогда, когда мы используем этот элемент, присутствующий в DOM, и ожидать его видимости.

Вам необходимо использовать ExpectedConditions.visibilityOfElementLocated - он гарантирует, что:

  • Элемент присутствует в DOM

  • Элемент видимый

Когда вы используете ExpectedConditions.visibilityOf это не 'Проверьте, присутствует ли этот элемент в DOM.

У меня есть вопрос, вы инициализировали POM?Если нет, вам нужно инициализировать его следующим образом:

// To initialize elements. 
MyPage myPage = PageFactory.initElements(driver, MyPage.class);

ИЛИ в конструкторе:

public MyPage(WebDriver driver) { 
this.driver = driver; 
PageFactory.initElements(driver, this);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...