每次在selenium中GWT id元素都在变化

selenium.click("gwt-uid-204"); // this is recorded from Selenium IDE 

我点击了我的(gwt)java应用程序中的复选框。 gwt-uid正在改变,所以如果id改变了,那么我的应用程序中找不到我的元素。 正则表达式对我不起作用,我不确定我做错了什么。 谢谢你的帮助

 selenium.click("gwt-uid-[0-9]); 

我使用的是selenium 1.0.3,Java

许多GWT元素都带有ensureDebugId(UIObject上的方法),允许您将Ids显式设置为元素以进行测试和调试。 您还需要inheritance该模块

   

使它工作。 这样做的好处是,您可以通过在prod模式编译期间删除inheritance的模块来从生产部署中删除跟踪。 因此,不会有代码更改来删除不必要的ID。

你可以用3/4方式完成它可以检查这个链接: 3种处理GWT动态元素ID的方法,它讨论了为GWT元素分配静态id的3种不同方法。

此外,您可以编写一个自定义的JavaScript方法,它将动态获取所有ID。 然后,您可以处理那些selenium动作的ID。

有两种可能的解决方案。 第一个是通过说regex:gwt-uid- [0-9]告诉Se你正在使用正则表达式。 正如你所拥有的那样,它正在寻找其名称或id是文字字符串的元素。

另一个解决方案是打开我在http://element34.ca/blog/google-web-toolkit-and-id中讨论的内容的静态id。

-亚当

假设您有动态ID,如您所示,首先要意识到Selenium的click方法需要一个定位器参数。 一种简单的方法是指定一个定位器,该定位器找到以常量“gwt-uid-”前缀开头的ID。 您可以使用任何这些定位器作为click方法的参数,具体取决于您对技术的偏好:

   == XPath ==
    //输入[starts-with(@ id,'gwt-uid-')]

   == CSS ==
    CSS =输入[ID ^ = 'GWT-uid-']

   == DOM ==
    dom = for each(e in document.getElementsByTagName('input'))if(e.id &&(e.id.substr(0,'gwt-uid  - '。length)==='gwt-uid-') )e

脚注1 :我没有使用GWT,所以我上面的例子假设它仍然在元素中放置一个复选框; 根据需要调整。

脚注2 :正如Adam所暗示的那样,Selenium确实提供了正则表达式支持,但在这种情况下它有两个问题:(1)前缀是“regexp:”而不是“regex:”。 (2)Selenium的click方法根本支持regexp前缀! (我的经validation据表明,定位器在Selenium中不使用正则表达式,只有文本匹配参数才能使用。)

您还可以使用Firebug添加来删除GWT UID。

  • 右键单击GWT UID所在的位置,然后选择“使用firebug检查元素” –
  • 单击GWT UID所在的代码,当出现firebug窗口时选择“deleted attributes id”
  • 删除id后,再次右键单击并复制“Xpath”
  • 添加一个额外的(/)并将xpath粘贴到目标上。

这也可能有所帮助。