Java Selenium元素未附加到页面文档

时间:2018-03-30 12:10:57

标签: java selenium

我正在尝试编写测试:转到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);

我收到错误消息"元素未附加到页面文档" 如果有人可以运行我的代码并告诉我我的错误在哪里,我将非常感激。

2 个答案:

答案 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();
}}