Selenium报错:'id(java.lang.String)'无法应用于'(org.openqa.selenium.By)'求助
解决Selenium中By定位元素的参数类型错误
问题原因
你编写的getUserNameLocator()方法已经直接返回了一个By实例(By.id("user-name")),但在isLoaded()和login()方法里,你又把这个By实例传给了By.id()——而By.id()的参数要求是String类型的id字符串,不是By对象,这就导致了参数类型不匹配的报错。
修正后的代码
只需要直接使用getUserNameLocator()返回的By对象,不需要再额外调用By.id():
package adta; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.support.ui.ExpectedConditions; public class LoginPage extends BasePage { public LoginPage(WebDriver driver) { super(driver); } public By getUserNameLocator(){ return By.id("user-name"); } public void open(){ driver.get("https://www.saucedemo.com/"); } public boolean isLoaded(){ // 直接使用getUserNameLocator()返回的By对象 return wait.until(ExpectedConditions.visibilityOfElementLocated(getUserNameLocator())).isDisplayed(); } public void login(String username, String password) { // 直接使用getUserNameLocator()返回的By对象 driver.findElement(getUserNameLocator()).sendKeys(username); driver.findElement(By.id("password")).sendKeys(password); driver.findElement(By.id("login-button")).click(); } }
补充说明
如果你想通过方法返回id字符串而非By对象,也可以调整getUserNameLocator()的返回值类型为String,此时再用By.id()包裹才是正确的,示例如下:
public String getUserNameLocator(){ return "user-name"; } // 调用时 driver.findElement(By.id(getUserNameLocator())).sendKeys(username);
内容的提问来源于stack exchange,提问作者Adexis
相关产品推荐
相关产品推荐

