我正在尝试编写测试:转到gmail.com并登录帐户。 我遇到了麻烦。这是我的代码
driver.get(gmailUrl);
WebElement elLogin = driver.findElement(By.cssSelector("input#identifierId"));
elLogin.sendKeys(gmailLogin);
WebElement elClick = driver.findElement(By.xpath("//content/span[contains(text(),'Next')]"));
elClick.click();
WebElement elPass = driver.findElement(By.cssSelector("input.whsOnd.zHQkBf"));
//String pass = elPass.getTagName();
//System.out.println(pass);
//WebDriverWait wait = new WebDriverWait(driver, 5);
Thread.sleep(2000);
elPass.sendKeys(gmailPassword);
我收到错误消息"元素未附加到页面文档" 如果有人可以运行我的代码并告诉我我的错误在哪里,我将非常感激。
答案 0 :(得分:0)
我认为您对密码输入元素的选择并不好。如果我打开gmail.com,分配给这个元素的类是" rFrNMe KSczvd BlbNGe zKHdkd sdJrJc Tyc9J"。似乎这些类是由Google用作此站点的后端框架的动态创建的。
所以你应该找到一个更好的CSS选择器来识别密码元素。我这里没有Java环境,所以我只能暗示(不保证成功):
WebElement elPass = driver.findElement(
By.cssSelector("#password input"));
这将选择元素中id = password的第一个输入元素。 CSS选择器中的空格意味着在元素下面找到具有给定id的输入元素。您还可以编写"div[id=password] input"
,这有点具体,因为您现在请求id = password的元素为div
类型。
查看https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Selectors
答案 1 :(得分:0)
您的定位器没有任何问题,我在代码中进行了少量更改后成功登录了它们。
"元素未附加到Page Document"也称为StaleElementReference异常意味着虽然找到了该元素,但在您想与其进行交互时,它不再附加到DOM。主要原因是(部分)刷新页面。
当您移动Thread.Sleep返回一行时,所以在" WebElement elPass = ....." ,您的代码将等到页面的这一部分刷新后再搜索密码字段,Selenium将不再有任何问题与该密码字段进行交互。
在这里找到我成功测试的代码解决方案:
import org.openqa.selenium.By;
import org.openqa.selenium.WebDriver;
import org.openqa.selenium.WebElement;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
public class Question49574195
{
public static void main(String[] args) throws InterruptedException
{
System.setProperty("webdriver.chrome.driver", "c:/chromedriver.exe");
WebDriver driver = new ChromeDriver();
driver.manage().window().maximize();
driver.get("https://mail.google.com/mail");
WebElement elLogin = driver.findElement(By.cssSelector("input#identifierId"));
elLogin.sendKeys("youremailadress");
WebElement elClick = driver.findElement(By.xpath("//content/span[contains(text(),'Next')]"));
elClick.click();
Thread.sleep(3000);
WebElement elPass = (driver.findElement(By.cssSelector("input.whsOnd.zHQkBf")));
elPass.sendKeys("yourpassword");
WebDriverWait wait = new WebDriverWait(driver, 15);
WebElement next = wait.until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//content/span[contains(text(),'Next')]")));
next.click();
}}