当前位置: 首页 > 知识库问答 >
问题:

将WebElement作为参数传递给隐式等待方法

晋俊贤
2023-03-14

我在我的Page中编写了以下方法.class用于重用隐式等待。

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

在我的测试中。我使用的类是页面工厂元素,例如:

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

现在我正试图从测试中调用waitForElementToLoad(saveButton)。。类,但我得到下面的错误。

“java.lang.ClassCastException:class.com.sun.proxy.$Proxy12不能转换为class.org.openqa.selenium.By(com.sun.proxy.$Proxy12和org.openqa.seleniuma.By位于加载器'app'的未命名模块中)。”

我也试过了

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

但是运气不好。

我怎样才能做到这一点?

共有3个答案

端木志诚
2023-03-14

此错误消息...

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。

您需要考虑以下几件事:

> < li >您在< code > waitForElementToLoad()中引入的等待本身不是隐式等待,而是显式等待。请参阅:隐式等待和显式等待的内部工作区别是什么 < Li > < code > presenceOfElementLocated()不保证任何元素的可见性或可交互性。因此,对于可见性或交互性,您需要使用匹配的预期条件< code > visibility of(web element element)或< code > elementtoclickable(By locator)。有关详细信息,请参见:Selenium:Selenium如何识别可见或不可见的元素?有没有可能是加载在DOM里却没有呈现在UI上? < li>

如果您的用例涉及诱导WebDriverWait,您可以在< code > waitForElementToLoad()中以代理对象的形式传递WebElement saveButton,如下所示:

package com.pol.zoho.PageObjects;
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.support.FindBy;
import org.openqa.selenium.support.PageFactory;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;

public class ZohoLoginPage {

    WebDriver driver;
    public ZohoLoginPage(WebDriver driver)
    {
    PageFactory.initElements(driver, this);
    }

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

    public void waitForElementToLoad()
    {
    WebElement element = new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(ZohoLoginPage.getWebElement()));
    saveButton.click();
    }

    public WebElement getWebElement()
    {
    return saveButton;
    }

}

您可以在以下网站中找到一些相关的讨论:

  • 如何在PageObjectModel的PageFactory中添加显式等待?
  • 如何使用Selenium和Java通过PageFactory等待元素的隐身
公冶翰池
2023-03-14

如果需要对包含异步加载元素的“Page”类使用ExpectedConditions,我建议使用以下方法:

  1. 扩展AjaxElementLocator,其中覆盖受保护的布尔值isElementUsable(WebElement元素),以便它使用预期条件来决定元素是否可以使用
  2. 扩展AjaxElementLocatorFactory其中覆盖public ElementLocator createLocator(Field field)方法,以便它现在返回扩展类的实例
  3. 初始化元素的地方使用PageFactory.initElements(new MyAjaxElementLocatorFactory(驱动程序,10),this);其中MyAjaxElementLocatorFactory是您在步骤2上创建的类
秦凯旋
2023-03-14

WebDriverWait 是显式等待,而不是隐式等待。而且你不能把WebElement投给By

如果 saveButton 不是空的,而不是页面工厂已经找到的,等待它的存在是没有意义的,这就是为什么你没有 WebElement 的重载。请改为等待可见性

wait.until(ExpectedConditions.visibilityOf(element));
 类似资料:
  • 问题内容: 我已经熟悉Android框架和Java,并希望创建一个通用的“ NetworkHelper”类,该类可以处理大多数联网代码,使我能够从中调用网页。 我遵循了来自developer.android.com的这篇文章来创建我的网络类:http : //developer.android.com/training/basics/network- ops/connecting.html 码:

  • 我正在编写一个方法,如果我想将一个类传递给一个方法,其中代码的一部分包括检查对象是否属于某种类型。这就是我想要的(但显然不行): 关于如何做到这一点有什么提示吗?谢谢!

  • 我有静态方法在我的类 这就是定义 这里用的是 这是我得到的一个错误 E0167类型为“void(TV_DepthCamAgent::)(int count,int copied_file)”的参数与类型为“void()(int,int)”的参数不兼容 错误C3867“TV_DepthCamAgent::progress_callback”:非标准语法;使用' 我做错了什么?

  • 问题内容: 我正在创建一个分页类,需要将两个参数传递给我的LIMIT子句的MySQL存储过程。 我将它们作为INT传递给我,并尝试这样的事情 但是,当我尝试保存该存储过程时,它给了我一个错误。有什么方法可以让我错过吗?还是我必须评估整个查询并执行它? 问题答案: 在5.5.6之前的版本中,无法在MySQL存储过程中进行参数化。您需要动态构建查询并执行它。 在5.5.6及更高版本中,只要将存储的pr

  • 问题内容: 我很好奇Go中是否有可能。我有多种方法的类型。是否可以有一个函数,该函数需要一个方法参数,然后将其称为类型? 这是我想要的一个小例子: Go认为type 有一个称为的方法,而不是用传入的方法名称替换它。 问题答案: 是的,有可能。您有2(3)个选项: 规范:方法表达式 该表达式产生的功能与第一个参数等效,但具有一个显式接收器。它有签名。 在这里,方法接收器是显式的。您只需将方法名称(具

  • 在下面的代码中,我希望将'races.class'作为参数传递给方法'get allraces()'。我该怎么做?