所以,我有一个A类,它有一个(公共静态WebElement element1,element2)。
public class myClass {
public static WebElement element1, element2;
public myClass(){
WebDriver driver = new FirefoxDriver();
this.element1 = driver.findElement(By.id("button"));
this.element2 = driver.findElement(By.id("text"));
}
}
然后我有一个测试类,它有一个名为@Test public void testClassA的方法。
@Test
public void testClassA(){
myClass m = new myClass();
m.element1.click();
m.element2.sendKeys("input something");
}
问题是我得到了org.openqa.selenium.NoSuchElementException:无法找到element:{}错误。我认为我的错误正在发生,因为element2位于下一页,单击按钮后会显示。我应该怎么做我的代码,以便当我将两个元素分配给findBy方法时,测试是通过第一次单击然后sendKeys到element2?
答案 0 :(得分:1)
正如您所提到的,element2出现在下一页中,您必须等到新页面加载。没有这个等待,如果你尝试找到element2,它将抛出一个异常,因为在页面改变之前在当前页面上找不到该元素。
解决方案:
1)在element1 click()方法之后添加显式等待。您可以等到click()后出现element2。
m.element1.click();
WebElement myDynamicElement = (new WebDriverWait(driver, 10)).until(ExpectedConditions.presenceOfElementLocated(By.id("text")));
m.element2.sendKeys("input something");
2)很简单,但我不推荐这个。使用Thread.sleep()等待加载新页面。
3)使用页面对象设计模式。
答案 1 :(得分:1)
您可以使用webdriver implicitwait等待页面上的元素加载一段时间。
driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
正如您在上面的代码中所看到的,我在页面上使用8秒来加载elemnets。 Read more about wait in Webdriver
使用try catch块来处理异常。
@Test
public void testClassA(){
driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
try{
myClass m = new myClass();
m.element1.click();
m.element2.sendKeys("input something");
}catch(NoSuchElementException e){
e.printStackTrace();
}
}
答案 2 :(得分:1)
您编写代码的方式将在以下情况下中断 元素是动态的,也是页面导航的。
在完全不同的类中查找webelement并在测试类中使用该类的对象不是一个好习惯。
正如您在代码myClass m = new myClass();
中看到的那样,当创建myClass
的对象时,会触发构造函数,并且驱动程序会同时找到element1
和element2
。并且,由于element2仍未显示,因此会抛出异常。
我不知道是什么促使你遵循这种做法,而是只在你真正需要的时候才找到它。似乎有很多选择,这取决于你想要的方式设计你的代码。
更多标准练习(我猜是这样):