1

我正在尝试将 ID 设置为 SelectItem(更准确地说是其选项列表),以便能够在 Selenium Grid 2 测试期间识别它并且找不到任何方法。我需要的是找到列表并在上面选择(单击)一个值。

尝试和失败的意图:

  1. 用于此目的的常用方法,setID()ensureDebugId()SelectItem 中不可用
  2. 该方法setName()不会在生成的 HTML 中留下任何痕迹
  3. 在包含 SelectItem 的表单上找不到选项列表。SelectItem 由单独的元素组成:

    • 标签(标题)
    • textInput(选定的值)
    • 选择器(显示选项下拉列表的按钮)
    • pickList(选项下拉列表)

    如果您为包含此组件的表单设置一个 ID 以便通过它进行本地化,className您将无法发现pickList,因为它是在单击选择器并且生成的代码被放置在表单边界之外时生成的,因此您可以在表格中找不到它。可以在整个文档中找到它,但如果有多个列表,则无法知道哪个列表属于哪个 SelectItem。

欢迎任何建议。先感谢您。

更新:我想澄清一些事情以避免误解:我知道对于不同的 Selenium 工具和版本以及将它与 Smart GWT 一起使用的最佳方式有很多不同的意见。这个问题没有进入这些讨论。它仅限于问题标题中指示的边界:Selenium Grid 2 tests with WebDriver。

一些背景知识:在编码我们的 GWT 组件时,我们会用测试方法识别其中的一些(小心,不要重复)setID(),我们并不关心这些标识符可能会在生成的 HTML 中被读取。(由于某种原因,使用ensureDebugId()扭曲了我们的观点。此外,Isomorphic 的人建议忘记它,无论如何。)但setID()不适用于FormItem,即我们无法将 ID 设置为SelectItem(从 扩展FormItem)以便编写第一个测试非空选项将被选中。

4

2 回答 2

1

我能找到的是 aSelectItem可以让您设置选择器图标名称,这是我们从未使用和/或需要的东西:

selectItemInstance.setPickerIconName("someName");

此名称稍后会出现在生成的 HTML 中。所以我们决定利用它并以这种方式分配一个 ID,就像setID(). 这些WebDriver方法允许您稍后SelectItem按照以下步骤按此名称查找元素:

SelectItem1)通过 ID找到表单(里面有元素)

2)找到SelectItem表单内的所有元素

formElement.findElements(By.className("selectItemControl"));

3)选择pickerIconName等于分配的ID的那个setPickerIconName()(循环通过找到的元素):

selectItemElement.findElement(By.xpath("//*[@*='" + pickerIconNameID + "']"));

4)找到后,单击它以获取生成的选项列表

pickerElement.click();

注意:选项列表不是在第一次单击元素之前生成的SelectItem,然后保持打开状态,从可见变为不可见。生成时,它超出了包含相应SelectItem. 这可能是个问题,因为如果窗口中有多个SelectItem元素(很可能),则必须找到正确的选项列表。可以应用几个标准来找到它。我们选择选项列表的位置作为最简单和最可靠的位置:“粘”在SelectItem元素上的选项列表应该是正确的。

5)在窗口中找到所有选项列表:

driver.findElementsByClassName("pickListMenuBody")

6) 为SelectItem: usinggetLocation()getSize()methods选择正确的选项列表,检查找到的选项列表中的哪个与通过步骤 2 和 3找到的元素(“selectItemControl”)WebElement相交/接触SelectItem

就是这样,从这里开始,只需在“listTable”中选择必要的项目(包含在选项列表元素中,即“pickListMenuBody”),您可能不止一次这样做。

请记住在搜索元素时考虑加载时间,并将您的实用程序/基础设施代码与测试代码分开,否则这将变得一团糟。

这不是最优雅的解决方案,但它对我们有用,我相信 GWT 和 Selenium 团队会及时提供更好的东西。

欢迎任何意见和建议(仅限使用 Selenium Grid 2)。谢谢你。

于 2013-06-12T13:18:30.550 回答
0

这里有很多关于如何使用 Selenium 和 Smart GWT 的文档:

http://www.smartclient.com/smartgwtee-latest/javadoc/com/smartgwt/client/docs/UsingSelenium.html

您不想使用您讨论过的方法。Smart GWT 生成的 DOM 被认为是内部细节,而不是直接使用 DOM,我们为您提供了一种基于抽象定位器的更强大的方法。

于 2013-04-29T17:55:09.280 回答