2016-03-04 24 views
1
class Test{  
public static WebDriver driver=null; 
public static void main(String[] args) throws Exception{ 
    driver=new FirefoxDriver(); 
    driver.navigate().to("http://www.w3schools.com/"); 
    Test.explicitWait("invisibilityOfElementLocated","xpath","//*[text()='LEARN HTML']"); 
    driver.findElement(By.xpath("//*[text()='HTML REFERENCE']")).click(); 
    } 

public static void explicitWait(String expectedConditionsMethod,String byMethod,String locator) throws Exception{ 
    WebDriverWait wait=new WebDriverWait(driver, 20); 
    Method by=By.class.getMethod(byMethod, String.class); 
    Object bymethod=by.invoke(null, locator); 
    Method expectedConditions=ExpectedConditions.class.getMethod(expectedConditionsMethod, By.class); 
    wait.until((Predicate<WebDriver>) expectedConditions.invoke(null, bymethod)); 
} 

} 

我想做一个明确的等待方法,可以直接调用,如上所示,但我不能做到这一点,请帮助。 获取错误“线程中的异常”main“java.lang.ClassCastException:org.openqa.selenium.support.ui.ExpectedConditions $ 18无法转换为com.google.common.base.Predicate at roughWork.Test.explicitWait(Test的.java:110) 在roughWork.Test.main(Test.java:29) “ 在Eclipse不能自己的方法使用硒的明确等待方法

回答

0

与实现的问题(看来)是你的explicitWait方法不会,如果你传递一个预期效果条件方法不返回WebDriver对象。

在你的情况下,当你调用invisibilityOfElementLocated,that method returns a Boolean时,不是WebDriver。 ExpectedConditions类中的其他方法返回一个WebElements列表。所以,你需要3种不同的显式等待方法来处理3种不同的返回谓词类型。

我会建议您为您的测试编写方法,只将定位器或WebElement作为单个参数,而不是尝试double-engineer it来传递ExpectedConditions类中方法的String名称。无论如何,如果该课程的实施发生变化,您就会发出麻烦。