Java 无法创建自己的方法来使用selenium的显式等待方法 类测试{ 公共静态WebDriver驱动程序=null; 公共静态void main(字符串[]args)引发异常{ 驱动程序=新的FirefoxDriver(); 驱动程序。导航()。到(“http://www.w3schools.com/"); Test.explicitWait(“invisibilityOfElementLocated”、“xpath”和“/*[text()='LEARN HTML']”; driver.findElement(By.xpath(“/*[text()='HTML REFERENCE']))。单击(); } publicstaticvoidexplicitwait(stringexpectedconditionsmethod、stringbymethod、stringlocator)引发异常{ WebDriverWait wait=新的WebDriverWait(驱动程序,20); methodby=by.class.getMethod(byMethod,String.class); objectbymethod=by.invoke(null,定位器); 方法expectedConditions=expectedConditions.class.getMethod(expectedConditionsMethod,By.class); wait.until((谓词)expectedConditions.invoke(null,bymethod)); } }

Java 无法创建自己的方法来使用selenium的显式等待方法 类测试{ 公共静态WebDriver驱动程序=null; 公共静态void main(字符串[]args)引发异常{ 驱动程序=新的FirefoxDriver(); 驱动程序。导航()。到(“http://www.w3schools.com/"); Test.explicitWait(“invisibilityOfElementLocated”、“xpath”和“/*[text()='LEARN HTML']”; driver.findElement(By.xpath(“/*[text()='HTML REFERENCE']))。单击(); } publicstaticvoidexplicitwait(stringexpectedconditionsmethod、stringbymethod、stringlocator)引发异常{ WebDriverWait wait=新的WebDriverWait(驱动程序,20); methodby=by.class.getMethod(byMethod,String.class); objectbymethod=by.invoke(null,定位器); 方法expectedConditions=expectedConditions.class.getMethod(expectedConditionsMethod,By.class); wait.until((谓词)expectedConditions.invoke(null,bymethod)); } },java,selenium,wait,Java,Selenium,Wait,我想做一个显式的等待方法,可以直接调用,如上图所示,但我不能这样做,请帮助。 获取错误“线程中的异常”main“java.lang.ClassCastException:org.openqa.selenium.support.ui.ExpectedConditions$18无法转换为com.google.common.base.Predicate 在rawwork.Test.explicitWait(Test.java:110)中 位于rawwork.Test.main(Test.java:29

我想做一个显式的等待方法,可以直接调用,如上图所示,但我不能这样做,请帮助。 获取错误“线程中的异常”main“java.lang.ClassCastException:org.openqa.selenium.support.ui.ExpectedConditions$18无法转换为com.google.common.base.Predicate 在rawwork.Test.explicitWait(Test.java:110)中 位于rawwork.Test.main(Test.java:29) "
在eclipse中,实现的问题(看起来)是,如果传递的预期条件方法不返回WebDriver对象,那么显式Wait方法将无法工作

在您的情况下,当您调用
invisibilityOfElementLocated
,而不是WebDriver时。ExpectedConditions类中的其他方法返回WebElements列表。因此,需要3种不同的显式等待方法来处理3种不同的返回谓词类型


我建议您为测试编写只将定位器或WebElement作为单个参数的方法,而不是尝试
对其进行双重工程
,以在ExpectedConditions类中传递方法的字符串名称。如果该类的实现发生了变化,您会自找麻烦。

您的实现(看起来)的问题是,如果您传递了一个不返回WebDriver对象的预期条件方法,那么您的explicitWait方法将无法工作

在您的情况下,当您调用
invisibilityOfElementLocated
,而不是WebDriver时。ExpectedConditions类中的其他方法返回WebElements列表。因此,需要3种不同的显式等待方法来处理3种不同的返回谓词类型

我建议您为测试编写只将定位器或WebElement作为单个参数的方法,而不是尝试
对其进行双重工程
,以在ExpectedConditions类中传递方法的字符串名称。如果该类的实现发生变化,您会自找麻烦

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));
}

}