gpt4 book ai didi

javascript - 提交后重新填写表单后出现 Selenium StaleElementException

转载 作者:行者123 更新时间:2023-12-02 12:34:17 26 4
gpt4 key购买 nike

我有一个表单,正在尝试自动填写我的一个 Selenium 脚本。有一个表单,大约有 4 个文本字段,其 HTML 如下所示

<input class="class" id="id" name="name" value="" autocomplete="off" wtx-context="stuff" type="text">

填写完这些表格后,会出现一个输入提交按钮,其中包含以下 HTML 代码

<input id="id2" class="class2" value="Add Material" wtx-context="morestuff" type="submit">

我使用了以下 Java 代码,并成功填写和提交了表单,但一旦提交,我假设发生的情况是它们在 DOM 上刷新,然后抛出 StaleElement 异常对我。我通过访问主页并使用表单导航回到网页来解决这个问题,但如果有人知道的话,我正在寻找一种更优雅的解决方案。下面是我的 Java 代码。

Page.WriteToField(Page.Input_number(), "111111111");
Page.WriteToField(Page.Input_number2(), "222222222");
Page.WriteToField(Page.Input_date(), format.format(cal.getTime()));
Page.WriteToField(Page.Input_number3(), "3333");
Page.SubmitIngredient();

WriteToField() 函数如下所示

public void WriteToField(WebElement field, String text) {
field.click();
field.clear();
field.sendKeys(text);
}

我使用以下格式从页面类访问所有 WebElements

public WebElement Input_number() {
return wait.until(ExpectedConditions.elementToBeClickable(By.id("form1")));
}

最佳答案

为什么在实际检查元素是否可点击之前不先尝试检查该元素是否存在?

public WebElement Input_number() {
wait.until(ExpectedConditions.presenceOfElementLocated(By.id("form1")));
return wait.until(ExpectedConditions.elementToBeClickable(By.id("form1")));
}

更新-我要求添加元素存在的预期条件的原因是它确实再次执行查找元素操作。 [请参阅下面 presenceOfElementLocated 方法的实现] 所以我希望人们能够得到 element 作为返回。 [但我可能是错的]

public static ExpectedCondition<WebElement> presenceOfElementLocated(final By locator) {
return new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver driver) {
return ExpectedConditions.findElement(locator, driver);
}

public String toString() {
return "presence of element located by: " + locator;
}
};
}

除此之外,如果您检查 elementToBeClickable 方法的实现[下面的代码块],它不会执行查找操作,如果元素不可见或启用,它会抛出 StaleElementReferenceException异常。

 public static ExpectedCondition<WebElement> elementToBeClickable(final WebElement element) {
return new ExpectedCondition<WebElement>() {
public WebElement apply(WebDriver driver) {
WebElement visibleElement = (WebElement)ExpectedConditions.visibilityOf(element).apply(driver);

try {
return visibleElement != null && visibleElement.isEnabled()?visibleElement:null;
} catch (StaleElementReferenceException var4) {
return null;
}
}

public String toString() {
return "element to be clickable: " + element;
}
};
}

因此,在检查元素是否可见之前检查元素是否存在对我来说很有意义[正如我之前所说,我可能是错的]

关于javascript - 提交后重新填写表单后出现 Selenium StaleElementException,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45196617/

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