在测试自动化Web应用程序时,我获得了动态生成的ext-gen ID。我尝试使用xpath,但测试用例失败了。我经历了不同的网站,但没有找到任何运气。有人可以帮帮我吗?
谢谢你, Srinivas Marthi
答案 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')]")))
您可以在以下位置找到相关的详细讨论: