【问题标题】:How to use ext-gen ID generated by EXTJS in Selenium?如何在 Selenium 中使用 EXTJS 生成的 ext-gen ID?
【发布时间】:2011-08-26 05:48:45
【问题描述】:

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

谢谢你, 斯里尼瓦斯·马蒂

【问题讨论】:

  • 您需要提供页面 HTML 并告诉我们您要做什么。
  • 您不想在测试自动化期间使用 xpath 而不是 id 吗?那么你永远不会有问题。

标签: extjs selenium


【解决方案1】:

我在自动化 EXTJS 网站和自动生成 ID 方面取得了成功,尽管我不推荐这样做。 (因为 id 是自动生成的,如果向页面添加新元素,您的所有定位器都可能无效。)

我建议精确定位项目,而不是完整路径

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

【讨论】:

    【解决方案2】:

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

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

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

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

    【讨论】:

      【解决方案3】:

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

      对于 ExtJS 4,我建议使用 ComponentQuery:

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

      【讨论】:

        【解决方案4】:

        随着 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
          

        但是,会有很多其他元素具有以 ext-gen 开头的 id 属性。因此,要唯一标识 &lt;table&gt; 元素,您需要将 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')]")))
          

        参考

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2014-12-13
          • 2016-02-18
          • 1970-01-01
          • 1970-01-01
          • 2013-04-21
          • 1970-01-01
          相关资源
          最近更新 更多