我正在尝试使用selenium web驱动程序登录Gmail。我面临的问题是无法在输入框中设置密码。
以下是生成的错误消息:
线程"main"org.openqa.selenium.WebDriverException异常:未知错误:无法聚焦元素。
这是我的代码:
public static void main(String[] args) {
System.setProperty("webdriver.chrome.driver", "C:\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.navigate().to("http://www.gmail.com");
driver.findElement(By.cssSelector("#identifierId")).sendKeys("********@gmail.com");
driver.findElement(By.cssSelector("#identifierNext")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("#password")));
driver.findElement(By.cssSelector("#password")).sendKeys("********");
driver.findElement(By.cssSelector("#passwordNext")).click();
driver.close();
driver.quit();
}
等待元素变为可点击。以下是如何做到这一点。
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[type=password]"));
driver.findElement(By.cssSelector("input[type=password]")).sendKeys("your password");
这可能是等待问题和选择错误元素的组合。
尝试更改sendKeys中的选择器,如下所示:
driver.findElement(By.cssSelector("input[type=password]")).sendKeys("********");
如果仍然不起作用,您可以在呼叫之前尝试不同的等待条件,例如:
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[type=password]")));
你可能需要做一些实验来找到合适的等待条件,但同时做这两件事应该会得到你需要的。:)
您尝试使用的元素的cssSelector不正确。
我建议一直使用动态生成的xpath和/或cssSelector。
在下面的代码中,我使用动态生成的xpath作为电子邮件Id,使用cssSelector作为密码。试试这个,效果很好。
public static void main(String[] args)
{
System.setProperty("webdriver.chrome.driver", "Y:\Selenium\chromedriver.exe");
WebDriver driver=new ChromeDriver();
driver.navigate().to("http://www.gmail.com");
driver.findElement(By.xpath("//input[@type='email']")).sendKeys("*********@gmail.com");
driver.findElement(By.cssSelector("#identifierNext")).click();
WebDriverWait wait = new WebDriverWait(driver, 10);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.cssSelector("input[type=password]")));
driver.findElement(By.cssSelector("input[type=password]")).sendKeys("*********");
driver.findElement(By.cssSelector("#passwordNext")).click();
driver.quit();
}
您也可以在此处使用名称atribute,如下所示:
driver.findElement(By.name("password")).sendKeys("********");
我认为一切都解决了,但我想澄清为什么它不起作用:
要输入电子邮件,您使用了一个id,效果很好,因为ididentifierId
是您正在填写的文件的属性之一。
若要输入密码,您不能将password
用作id,因为您要填充的字段的属性中没有id。idpassword
存在,但它包含了大量的WebElement事实上,您正在将包含此字段的id与其他WebElements进行本地化,因此错误消息会告诉您它无法聚焦
您可以使用xpath,例如
driver.findElement(By.xpath("//input[@type='password']")).sendKeys("********");
或css选择器,例如:
driver.findElement(By.cssSelector("input[type=password]")).sendKeys("********");
但您不能使用ID访问此字段。
我尝试了所有这三种解决方案,它们都奏效了。关于可能的等待问题,请毫不犹豫地使用findElement
方法周围的服务员包装,这会有很大帮助。然而,我认为这不是这里的主要问题。