Передача WebElement в качестве параметра неявному методу ожидания - PullRequest
0 голосов
/ 18 февраля 2020

Я написал следующий метод в своем Page.class для повторного использования неявного ожидания.

public WebDriver waitForElementToLoad(WebElement element)
{
        WebDriverWait wait = new WebDriverWait(driver, 60);
        wait.until(ExpectedConditions.presenceOfElementLocated((By) element));
        return (driver);
}

В моем test.class я использую элементы фабрики страниц, например:

//Save button
@FindBy(xpath = "//*[@*='Save']")
private WebElement saveButton;

Теперь я пытаюсь вызвать: waitForElementToLoad(saveButton); из test.Class, но я получаю ошибку ниже.

"java .lang.ClassCastException: class com.sun.proxy. $ Proxy12 не может быть приведенным к классу org.openqa.selenium.By (com.sun.proxy. $ Proxy12 и org.openqa.selenium.By находятся в безымянном модуле загрузчика 'app') ""

Я также пробовал

WebElement saveButton = driver.findElement(By.xpath("//*[@*='Save']"));
waitForElementToLoad(saveButton);

но не повезло.

Как я могу сделать эту работу?

Ответы [ 3 ]

1 голос
/ 18 февраля 2020

WebDriverWait явное ожидание, а не явное. И вы не можете привести WebElement к By.

Если saveButton не null, чем это было уже найдено фабрикой страниц, ожидание его присутствия не имеет смысла, поэтому вы не перегрузка WebElement. Вместо этого дождитесь видимости

wait.until(ExpectedConditions.visibilityOf(element));
0 голосов
/ 18 февраля 2020

Это сообщение об ошибке ...

java.lang.ClassCastException: class com.sun.proxy.$Proxy12 cannot be cast to class org.openqa.selenium.By (com.sun.proxy.$Proxy12 and org.openqa.selenium.By are in unnamed module of loader 'app')

... означает, что ClassCastException произошло при попытке приведения объекта proxy .

Вам необходимо учесть несколько вещей следующим образом:


Ссылка

Вы можете найти пару соответствующих обсуждений в:

0 голосов
/ 18 февраля 2020

Если вам нужно использовать ExpectedConditions с некоторым вашим классом «Page», который содержит асинхронно загруженные элементы, я бы рекомендовал использовать следующий подход:

  1. Расширить AjaxElementLocator, где переопределить protected boolean isElementUsable(WebElement element) так что он использует ExpectedConditions, чтобы решить, готов ли элемент для использования
  2. Расширить AjaxElementLocatorFactory, где переопределить public ElementLocator createLocator(Field field) метод, так что теперь он возвращает экземпляр вашего расширенного класса
  3. Где Вы инициализируете элементы, используя PageFactory.initElements(new MyAjaxElementLocatorFactory(driver, 10), this);, где MyAjaxElementLocatorFactory - это класс, который вы создали на шаге 2
...