我正在尝试使用selenium网络驱动程序登录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();
}
答案 0 :(得分:1)
等待直到元素变为可单击。这是您的操作方法。
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");
答案 1 :(得分:0)
这可能是等待问题和选择错误元素的组合。
尝试更改sendKeys中的选择器,如下所示:
driver.findElement(By.cssSelector("input[type=password]")).sendKeys("********");
如果仍然无效,您可以在该呼叫之前尝试不同的等待条件,例如:
wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector("input[type=password]")));
你可能需要做一些实验来找到合适的等待条件,但做这两件事情应该可以得到你所需要的。 :)
答案 2 :(得分:0)
您尝试使用的元素的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();
}
答案 3 :(得分:0)
您也可以在此处使用名称属性,例如:
driver.findElement(By.name("password")).sendKeys("********");
我认为一切都已解决,但是我希望澄清它为什么不起作用:
要输入电子邮件,您使用了ID并且工作正常,因为ID identifierId
是您填写的字段的属性之一。
要输入密码,您不能将password
用作ID,因为您尝试填写的字段在其属性中没有ID。标识password
存在,但它包含更多的WebElement。 事实上,您正在本地化包含此字段的ID以及其他WebElements ,因此错误消息告诉您无法关注
你可以使用xpath,例如
driver.findElement(By.xpath("//input[@type='password']")).sendKeys("********");
或css选择器如:
driver.findElement(By.cssSelector("input[type=password]")).sendKeys("********");
但您无法使用ID访问此字段。
我尝试了所有这三种解决方案并且他们工作了。
关于可能的等待问题,请不要犹豫使用findElement
方法的服务员包装,它可以帮助很多。但是,我认为这不是主要问题。