每次在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粘贴到目标上。
这也可能有所帮助。