我正在尝试用Java编写一个用于Web应用程序的Selenium测试脚本。该应用程序有一个按钮,可以在屏幕上动态添加表单域。我遇到的问题是我似乎无法让Selenium Web Driver识别新的表单元素元素。我首先尝试使用@FindBy初始化构造函数中的元素,如下所示:
@FindBy(how = How.CSS, using = "#WIN_0_536870929") private WebElement form;
然后,我尝试使用显式等待来确保元素已加载(在将表单添加到DOM的按钮上):
WebDriverWait webDriverWait = new WebDriverWait(this.getDriver(), 20);
WebElement formButton = webDriverWait.until(ExpectedConditions.elementToBeClickable(By.id("WIN_0_536870929")));
formButton.click();
但无论如何,动态表单元素都无法加载。我得到的错误如下:
org.openqa.selenium.NoSuchElementException:无法找到元素:{“method”:“id”,“selector”:“#WIN_0_817000996”}
更令人困惑的是,当我在调试器中完成测试时,表单字段在测试尝试访问之前完全加载到DOM中。
有没有人知道可能导致这种情况发生的原因?
答案 0 :(得分:2)
事实证明我试图访问iframe中的元素。非常感谢Vivek Singh建议我调查一下。我能够使用以下代码进入iframe:
this.driver.switchTo().frame(this.driver.findElement(By.cssSelector("#WIN_0_817000899 iframe")));
答案 1 :(得分:-1)
只有在您期望其可见性时才需要定义WebElement:
public static WebElement waitForVisibleElement( WebDriver driver, By locator, int timeOutInSeconds ) {
WebDriverWait wdw = new WebDriverWait( driver, timeOutInSeconds );
try {
return wdw.until( ExpectedConditions.visibilityOfElementLocated(locator) );
} catch ( NoSuchElementException | TimeoutException | NullPointerException ex ) {
return null;
}
}