Oop 访问类变量时的Selenium NoTouchElementException
所以,我有一个类a,它有一个(公共静态WebElement element1,element2) 然后我有一个测试类,其中有一个名为@test public void testClassA的方法Oop 访问类变量时的Selenium NoTouchElementException,oop,selenium,webdriver,Oop,Selenium,Webdriver,所以,我有一个类a,它有一个(公共静态WebElement element1,element2) 然后我有一个测试类,其中有一个名为@test public void testClassA的方法 @Test public void testClassA(){ myClass m = new myClass(); m.element1.click(); m.element2.sendKeys("input something"); } 问题是我得到org.open
@Test
public void testClassA(){
myClass m = new myClass();
m.element1.click();
m.element2.sendKeys("input something");
}
问题是我得到org.openqa.selenium.NoSuchElementException:无法定位元素:{}错误。我认为我的错误是因为element2位于下一页,它在单击按钮后显示。我应该在代码中做些什么,这样当我将两个元素分配给findBy方法时,测试将通过第一次单击,然后将键发送给element2 正如您提到的,element2将出现在下一页中,您必须等待新页加载。如果没有这种等待,如果您尝试查找element2,它将抛出一个异常,因为在页面更改之前,在当前页面上找不到该元素 解决方案: 1) 在element1 click()方法之后添加显式等待。您可以等到单击()之后出现element2 2) 很简单,但我不建议这样做。使用Thread.sleep()等待加载新页面
3) 使用页面对象设计模式。您可以使用webdriver implicitwait等待页面上的元素加载一段时间
driver.manage().timeouts().implicitlyWait(8, TimeUnit.SECONDS);
正如您在上面的代码中所看到的,我用了8秒来加载页面上的元素
使用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();
}
}
您编写代码的方式将在以下场景中有所突破:
元素是动态的,也是页面导航
在不同的类中找到webelement并在测试类中使用该类的对象,这不是一个好的做法
正如您在代码中看到的:myClass m=newmyclass()
,当创建myClass
的对象时,构造函数被触发,驱动程序同时找到element1
和element2
。而且,由于element2仍然没有显示,它会抛出一个异常
@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();
}
}
我不知道是什么促使您遵循这种做法,相反,只在您真正需要的时候才查找webelement。似乎有很多选择,这取决于您希望如何设计代码
很好的参考资料:改进格式,以便更多地关注您的问题。由于您正在处理页面,请遵循页面对象模式。当您单击按钮(即element1)时会发生什么情况?当我单击它时,假设转到下一页。但是,即使在单击它之前,也会抛出错误。这就是我所想的,在上一个页面类中查找下一个页面的元素是我做错的。非常感谢。帮了我很多,而且你的链接也很好!
@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();
}
}