【问题标题】:Java Selenium element is not attached to the page documentJava Selenium 元素未附加到页面文档
【发布时间】:2018-03-30 12:10:56
【问题描述】:

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

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

【问题讨论】:

标签: java selenium


【解决方案1】:

我认为您对密码输入元素的选择不好。如果我打开 gmail.com,分配给该元素的类是“rFrNMe KSczvd BlbNGe zKHdkd sdJrJc Tyc9J”。似乎这些类是由谷歌用作该站点的后端框架的任何动态创建的。

所以你应该找到一个更好的 CSS 选择器来识别密码元素。我这里没有Java环境,所以只能提示(不保证成功):

    WebElement elPass = driver.findElement(
         By.cssSelector("#password input"));

这将选择 id = 密码的元素中的第一个输入元素。 CSS 选择器中的空格表示查找具有给定 id 的元素下方的输入元素。你也可以写"div[id=password] input",它更具体一点,因为你现在请求id = password的元素是div类型。

查看https://developer.mozilla.org/en-US/docs/Learn/CSS/Introduction_to_CSS/Selectors

【讨论】:

  • 是的,我知道这将是最好的解决方案,但是这个输入元素没有任何 ID ...我该怎么办?
  • 查看css。它首先选择带有名称输入的div,然后向下钻取到此div 中的input 元素。 CSS 选择器可能非常复杂。我建议读一读。例如这里:saucelabs.com/resources/articles/selenium-tips-css-selectors
【解决方案2】:

您的定位器没有任何问题,在您的代码稍作更改后,我设法使用它们登录。

“元素未附加到页面文档”也称为 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();
}}

【讨论】:

  • 谢谢。我还认为问题不在于定位器。你能告诉我应该在我的代码中添加什么代码才能完成我的测试吗?
  • 您是否将 Thread.Sleep 移到了我告诉您的地方?完成此操作后,您的代码应该可以工作了。
  • 是的,我做到了,现在我得到下一个错误:org.openqa.selenium.ElementNotVisibleException: element not visible
  • @WEBSITEFREELANCE 你成功运行你的代码了吗?
猜你喜欢
  • 2021-07-16
  • 1970-01-01
  • 1970-01-01
  • 2019-04-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-12-15
相关资源
最近更新 更多