为什么Gmail会改变某些元素的id元素?

Why does Gmail change id elements of some elements?

这是 Gmail 中的一个元素,正是 "Compose" 按钮。看id,当我没有未读消息时是":il"。

<div id=":il" class="aic">
<div class="z0">
<div class="T-I J-J5-Ji T-I-KE L3" tabindex="0" role="button" style="-moz-user-select: none;" gh="cm">COMPOSE</div>
</div>
</div> 

现在我只是给自己发了一封电子邮件,然后注销我的帐户并重新登录。当我检查元素时,id 已更改为“:3l”。

<div id=":3l" class="aic">
<div class="z0">
<div class="T-I J-J5-Ji T-I-KE L3 T-I-JO" tabindex="0" role="button" style="-moz-user-select: none;" gh="cm">COMPOSE</div>
</div>
</div>

然后我阅读了邮件,注销并重新登录。当我读取元素时,我得到了原始 ID“:il”。

为什么Gmail会改变一些元素的id元素?我正在使用 WebDriver 和 Java,这让我发疯。可能我必须改变定位这个元素的方式。

此致!

添加了我的测试编码:

public static void main(String[] args) 
{
    WebDriver driver;
    String baseUrl;

    driver = new FirefoxDriver();
    baseUrl = "https://www.google.com.ar/";
    driver.manage().timeouts().implicitlyWait(30, TimeUnit.SECONDS);

    driver.get(baseUrl + "/?gfe_rd=cr&ei=Tf_YVKv1G6yB8Qe_24HYDA&gws_rd=ssl");
    driver.findElement(By.linkText("Gmail")).click();
    driver.findElement(By.id("Passwd")).clear();
    driver.findElement(By.id("Passwd")).sendKeys("Not neccesary :D");
    driver.findElement(By.id("Email")).clear();
    driver.findElement(By.id("Email")).sendKeys("Not_neccesary_:D");
    driver.findElement(By.id("signIn")).click();

    //APARENTLY THERE ARE PROBLEMS WHEN I HAVE MESSAGES UNREADED

    driver.findElement(By.xpath("//div[.='COMPOSE']")).click();
    driver.findElement(By.id(":uv")).sendKeys("Not_neccesary_:D@gmail.com");
    driver.findElement(By.id(":ul")).sendKeys("Test");
    driver.findElement(By.id(":vn")).sendKeys("aaaaaaaaaaa");
    driver.findElement(By.id(":ub")).click();

    driver.close();
}

正如我所说,这些是动态生成的 ID。在这种情况下,我总是更喜欢 xpathexplicit 等待。我会使用 xpath 基于文本的搜索。

//div[.='COMPOSE']

这,搜索任何 div 包含 COMPOSE 的元素作为文本

Gmail 不应使用 WebDriver 实现自动化。出于这个原因,他们故意使 id 动态化。你也为 google 工作吗?您正在为 google 测试 gmail 吗?如果不使用 WebDriver 来自动化 gmail 对我来说没有意义而且只是浪费时间。

您是否正在测试您的应用程序中发送电子邮件的内容并且您想要确保电子邮件已发送、您想要验证内容或者可能点击 link 或其他内容?做这些事情的最好方法是在后台使用像 JavaMail 这样的库和使用 Gmails pop3 服务器。这种方法将为您提供一致的结果,并且速度会快得多。您不必启动浏览器、与元素交互等。您还可以支持任何电子邮件提供商,而不仅仅是 Gmail,只要您有他们的 pop3 服务器详细信息。

查看我对类似问题的回答here

正如我在评论(已删除)中所写,xpath 不是好的做法。如果您需要单击 'Compose' 按钮并在您的选择器中使用 ids 卵形,您可以使用下一个选择器在页面上找到 'Compose' btn

driver.FindElement(By.Css(".aic div[role='button']")).click();

对我来说效果很好。