Oop 访问类变量时的Selenium NoTouchElementException

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

所以,我有一个类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.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。似乎有很多选择,这取决于您希望如何设计代码

  • 使用相同的类查找元素并对其执行操作
  • 使用不同的方法来查找webelements,而不是使用构造函数来查找它们
  • 如果您想让事情变得通用,请使用webdriver操作的关键字
  • 如果需要,请使用属性文件存储定位器和数据
  • 更多的标准实践(我想是的):

  • 用于查找webelements
  • 除了页面对象之外,还可以使用

  • 很好的参考资料:

    改进格式,以便更多地关注您的问题。由于您正在处理页面,请遵循页面对象模式。当您单击按钮(即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();
    }
    }