gpt4 book ai didi

java - 如何返回延迟实例化的动态网络元素

转载 作者:搜寻专家 更新时间:2023-10-31 20:28:57 25 4
gpt4 key购买 nike

我一直在使用 @FindBy有一段时间了,我喜欢这样一个事实,即元素在必要时才被定位(而不是在实例化时)。

但是,网页可能有 2-10 个特定元素,并且元素上的 ID 已编号(因此第一个元素的 ID 为“element1”,依此类推)

我想编写一个函数,我可以在其中传递一个整数,它将返回一个具有适当 ID 的 WebElement,AND 被延迟实例化。这意味着像下面这样的函数将不起作用:

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

因为在我调用该函数的那一刻,WebElement 就被找到了。 (它不能被实例化的原因是因为我有一个函数通过一遍又一遍地调用 isDisplayed() 来等待元素存在,捕获 NoSuchElementException s)。

我还意识到我可以创建一个 List<WebElement>它通过 CSS 选择 ID 以“element”开头的每个元素,但我遇到过其他情况,我想返回一个动态生成的元素,并且不得不在那里使用解决方法。

谢谢!

最佳答案

首先,我真的不明白为什么您绝对需要在元素真正出现在页面中之前获取 WebElement 引用。在正常情况下,您可以检查页面是否已完全加载,然后查找 WebElement。正如您提到的,首先通常会通过循环和捕获 NoSuchElementException 来完成。

但是,如果您需要在页面中找不到 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 检索它。请注意,如果您在代理实例上调用方法,则该元素必须在页面中,否则您当然会得到一个 NoSuchElementException

关于java - 如何返回延迟实例化的动态网络元素,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17818074/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com