为什么Gmail会更改某些元素的ID元素?

时间:2015-02-11 01:58:18

标签: html selenium gmail

这是来自Gmail的元素,恰好是“撰写”按钮。查看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();
}

3 个答案:

答案 0 :(得分:2)

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

您是否在应用中测试了发送电子邮件的内容,并且您希望确保发送电子邮件,您要验证内容还是点击链接或其他内容?执行此类操作的最佳方法是在后台使用JavaMail等库并使用Gmails pop3服务器。这种方法可以为您提供一致的结果,并且速度会明显加快。您不必启动浏览器,与元素交互等。只要您拥有pop3服务器详细信息,您就可以支持任何电子邮件提供商而不仅仅是Gmail。

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

答案 1 :(得分:1)

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

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

对我来说非常好。

答案 2 :(得分:0)

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

//div[.='COMPOSE']

这样,搜索COMPOSE为文本的任何div元素