Selenium Gmail登录密码字段



我正在尝试使用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方法周围的服务员包装,这会有很大帮助。然而,我认为这不是这里的主要问题。

最新更新