如何为Vaadin应用程序的UI组件生成唯一ID?

时间:2016-10-12 12:53:24

标签: java css selenium automated-tests vaadin

通常,Vaadin应用程序为应用程序的每个用户界面组件设置顺序ID。遗憾的是,这些ID对于测试自动化而言并不是非常有用,因为它们是动态生成的,并且可能在运行时(每个会话或添加新组件等)时发生变化。

对于测试自动化,每个组件都需要(至少每个应用程序)唯一的静态ID。

A)Vaadin的setId()方法[1]可以用来生成测试自动化友好的组件ID吗?

B)Vaadin的addStyleName()setStyleName()可以通过生成自定义CSS样式来实现,后者可能被滥用"作为身份证?

[3]中讨论的一些设计思路:

  • 将ID创建与ID分配分开
  • 使用命名策略创建id
  • 在组件附加时间分配id

[1] https://vaadin.com/api/7.7.3/com/vaadin/ui/Component.html#setId-java.lang.String-

[2] https://vaadin.com/api/7.7.3/com/vaadin/ui/Component.html#setStyleName-java.lang.String-

[3] https://vaadin.com/forum#!/thread/278068

1 个答案:

答案 0 :(得分:0)

  

A)Vaadin的setId()方法[1]可以用来生成测试自动化友好的组件ID吗?

是的,它取代了已弃用的setDebugId()。来自它的javadoc:

  

从界面复制的说明:com.vaadin.ui.Component

     

为客户端用于测试的组件添加唯一ID   目的。保持标识符的唯一性是责任   程序员。

我们没有将它与任何类型的命名策略自动化“框架”一起使用,正如您在第3个链接中所讨论的那样。我们根据内部协议手动设置组件ID。请注意,并非所有组件都可以分配ID,例如menu items

  

B)Vaadin的addStyleName()或setStyleName()是否可以通过生成自定义CSS样式来实现,后者可能会被“滥用”为ID?

你可以,但它与A)或多或少相同。然后,您可以使用findElement(By.className("some-class"));

查找元素
  

public static By className(@NotNull String className)

     

根据“class”属性的值查找元素。如果元素有很多   然后这将匹配每个类。例如,如果   value是“one one onone”,然后以下“className”将匹配:   “一”和“两个”

另一种选择是使用xpath,例如findElement(By.xpath("//*[contains(@class, 'column-hiding-toggle')]/span/div[text()='Name']"))

虽然非常强大且灵活(如果我没有误解By.id&amp; By.className是通过引擎盖下的xpath实现的,那么它的缺点是它可以变得高维护< / em>如果用户界面的结构经常变化。