当前位置: 首页 > 面试题库 >

如何返回懒惰实例化的动态Web元素

唐涛
2023-03-14
问题内容

我已经使用@FindBy了一段时间了,我喜欢这样的事实:该元素直到必要时才被定位(不在实例化时)。

但是,该网页可能具有某个元素2-10的任意位置,并且元素上的ID已编号(因此第一个元素的ID为“ element1”,依此类推)

我想编写一个函数,我可以在一个整数关口,它会返回一个WebElement与适当的ID, 被懒洋洋地实例化。这意味着具有以下功能将无法正常工作:

public WebElement getElement(int numOnPage){
    return driver.findElement(By.id("element"+numOnPage));
}

因为我立即调用该函数,即可找到WebElement。(之所以不能实例化它的原因是因为我有一个函数,可以通过在其上反复调用isDisplayed()来捕获NoSuchElementExceptions
,直到该元素存在为止。)

我还意识到,我可以创建一个List<WebElement>通过CSS选择ID以“ element”开头的每个元素的a
,但是在其他情况下,我想返回一个动态生成的元素,并且还必须使用一种变通方法。

谢谢!


问题答案:

首先,我不太了解为什么您绝对需要WebElement在元素真正出现在页面中之前获得引用。在正常情况下,您可以检查页面是否已完全加载,然后查找WebElementNoSuchElementException如前所述,通常首先使用html" target="_blank">循环和捕获来完成。

但是,如果需要WebElement在页面上找不到引用之前的引用,我将简单地创建一个代理(延迟仅在第一次需要时)加载真实WebElement实例。像这样:

public WebElement getElement(final int numOnPage) {
        return (WebElement) Proxy.newProxyInstance(this.getClass().getClassLoader(), new Class<?>[] { WebElement.class }, new InvocationHandler() {
            // Lazy initialized instance of WebElement
            private WebElement webElement;

            public Object invoke(Object proxy, Method method, Object[] args)
                    throws Throwable {
                if (webElement == null) {
                    webElement = driver.findElement(By.id("element" + numOnPage));
                }
                return method.invoke(webElement, args);
            }
        });
    }

通过调用getElement,可以检索类型为的对象WebElement。调用其方法之一后,就会使用检索它WebDriver.findElement。请注意,如果在代理实例上调用方法,则该元素必须在页面中,否则当然会得到a
NoSuchElementException



 类似资料:
  • 问题内容: 如果按以下方式实现单例, 此实现与延迟初始化方法有何不同?在这种情况下,实例将在加载类时创建,并且仅在第一次使用时才加载类本身(例如,Singleton.getInstance(),而当您声明实例Singleton singleton = null;时则不会)。 即使采用惰性初始化方法,该实例也是在对getInstance()的调用上创建的 我在这里想念什么吗? 问题答案: 您也可以调

  • 问题内容: 我有一个让我真正困惑的事情,特别是以下代码触发了编译器错误“ unresolved identifier self”,我不确定为什么会这样,因为懒惰意味着在使用该属性时,该类已经实例化了。我想念什么吗? 提前谢谢了。 这是代码 问题答案: 由于某种原因,如果惰性属性的初始值引用,则需要显式类型注释。在swift- evolution邮件列表中 提到了这一点,但是我无法解释 为什么 这样

  • 问题内容: 当我尝试获取懒惰的初始化实体时,我在IDE中看到以下异常消息(我无法找到它在代理实体中的存储位置,因此无法为该异常提供整个堆栈跟踪): 这是我尝试访问要使用的惰性初始化实体的字段后得到的堆栈跟踪: 我正在使用Spring Data,已配置JpaTransactionManager,数据库是MySql,ORM提供程序是Hibernate4。注释@EnableTransactionMana

  • 问题内容: 返回一个类型列表。但是List是一个接口,那么如何实例化它呢?如果尝试并实例化一个类型化的列表,我会收到一条错误消息,指出这是不可能的。 编辑 没关系,我看到了怎么回事,只是被文档混淆了片刻。 问题答案: 这是一个不应该与混淆。它是数组的包装,这意味着您进行了任何更改,更改了原始数组,并且无法添加或删除条目。通常将其与ArrayList结合使用,例如

  • 问题内容: 返回一个类型列表。但是List是一个接口,那么如何实例化它呢?如果尝试并实例化一个类型化的列表,我会收到一条错误消息,指出这是不可能的。 编辑 没关系,我看到了怎么回事,只是被文档混淆了片刻。 问题答案: 这是一个不应该与混淆。它是数组的包装,这意味着您进行了任何更改,更改了原始数组,并且无法添加或删除条目。通常将其与ArrayList结合使用,例如

  • 问题内容: 创建单例的模式似乎是这样的: 但是我的问题是,如果Singleton构造函数执行的不是单元测试友好的操作,例如如何调用外部服务,jndi查找等,您如何使用这样的类进行单元化? 我想我可以像这样重构它: 现在的问题是,仅出于单元可测试性,我已强制将getInstance同步,因此仅出于测试方面,它将对实际应用程序产生负面影响。有没有解决的办法,由于Java中双重锁定模式的破坏性,似乎其他