访问类变量时Selenium NoSuchElementException

时间:2015-07-28 02:54:59

标签: oop selenium webdriver

所以,我有一个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?

3 个答案:

答案 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的对象时,会触发构造函数,并且驱动程序会同时找到element1element2。并且,由于element2仍未显示,因此会抛出异常。

我不知道是什么促使你遵循这种做法,而是只在你真正需要的时候才找到它。似乎有很多选择,这取决于你想要的方式设计你的代码。

  1. 使用相同的类来查找元素并对其执行操作。
  2. 使用不同的方法查找webelements,而不是使用构造函数来查找它们。
  3. 如果您想要通用的话,请使用关键字进行webdriver操作。
  4. 如果需要,使用属性文件存储定位器和dat。
  5. 更多标准练习(我猜是这样):

    1. 使用Page Objects查找元素。
    2. 除页面对象外还使用PageFactory
    3. 好参考:http://www.guru99.com/page-object-model-pom-page-factory-in-selenium-ultimate-guide.html