GWT id元素每次都在硒中发生变化

时间:2011-03-26 20:16:52

标签: java gwt selenium

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

5 个答案:

答案 0 :(得分:15)

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

 <inherits name="com.google.gwt.user.Debug"/> 

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

答案 1 :(得分:5)

你可以用3/4的方式做到这一点 可以查看此链接: 3 ways of dealing with GWT dynamic element Ids 其中讨论了为GWT元素分配静态ID的3种不同方法。

另外, 您可以编写一个自定义的javascript方法,它将动态获取所有ID。然后,您可以处理这些硒动作的ID。

答案 2 :(得分:0)

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

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

- 亚当

答案 3 :(得分:0)

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

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

  == CSS ==
   css=input[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,所以上面的例子假设它仍然在<input>元素中放置一个复选框;根据需要调整。

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

答案 4 :(得分:0)

您还可以使用Firebug add ons删除GWT UID。

  • 右键单击GWT UID所在的位置,然后选择&#34;检查元素 萤火&#34; -
  • 单击GWT UID所在的代码以及firebug窗口的时间 出现选择&#34;已删除的属性ID&#34;
  • 删除ID后,再次右键单击并复制&#34; Xpath&#34;
  • 添加额外的(/)并将xpath粘贴到目标上。

This也可以提供帮助。