如何在Selenium中使用EXTJS生成的ext-gen ID?

时间:2011-05-16 07:38:02

标签: extjs selenium

在测试自动化Web应用程序时,我获得了动态生成的ext-gen ID。我尝试使用xpath,但测试用例失败了。我经历了不同的网站,但没有找到任何运气。有人可以帮帮我吗?

谢谢你, Srinivas Marthi

4 个答案:

答案 0 :(得分:1)

对于自动化测试,最好完全避免自动生成的ExtJS ID。您可以将自己的静态ID分配给组件,但现在您基本上乱丢了全局变量的代码,也不好。使用某些ID可能是一种有用的折衷方案,但您不希望为每个小按钮分配ID。

对于ExtJS 4,我建议使用ComponentQuery

Ext.ComponentQuery.query("panel[title='Orders'] button[text='Save']")

答案 1 :(得分:0)

我已成功自动化EXTJS网站和自动生成的ID,但我不推荐它。 (因为id是自动生成的,如果将新元素添加到页面中,则所有定位器都可能无效。)

我建议用针对精确的项目,而不是完整的路径

//*[@id="ext-js123"]

答案 2 :(得分:0)

使用Selenium最好的方法是在代码中设置唯一的ID。

由于没有配置按钮,您必须在创建按钮后附加按钮的ID。 在ExtJS 3中,我们用来设置按钮的ID:

dlg.getDialog().getEl().select('button').each(function(el) {
    el.dom.id = 'confirm-' + el.dom.innerHTML;
});

不幸的是,这在ExtJS 4中不再起作用,所以我也在寻找新的解决方案。 ; - )

答案 3 :(得分:0)

随着 id 属性值的更改,即动态变化,您将无法使用 id 属性的完整值,而只能使用部分值这是静态的。例如,对于以下HTML:

<table id='ext-gen1076' class='bats-table bats-table--center'>
[...]
</table>

要标识<table>节点,您需要为visibility_of_element_located()引入 WebDriverWait ,并且可以使用以下任一Locator Strategies

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table[id^='ext-gen']")))
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[starts-with(@id,'ext-gen')]")))
    
  • 注意:您必须添加以下导入:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    

但是,还有很多其他元素,其 id 属性以 ext-gen 开头。因此,要唯一标识<table>元素,需要将 class 属性组成如下:

  • 使用CSS_SELECTOR

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.CSS_SELECTOR, "table.bats-table.bats-table--center[id^='ext-gen']")))
    
  • 使用XPATH

    WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//table[@class='bats-table bats-table--center' and starts-with(@id,'ext-gen')]")))
    

参考

您可以在以下位置找到相关的详细讨论: