【问题标题】:Handle elements that have changing ids all the time through Selenium Webdriver通过 Selenium Webdriver 处理 id 一直在变化的元素
【发布时间】:2014-05-11 03:44:37
【问题描述】:

我正在运行脚本来自动化测试用例并且遇到了这个独特的问题。 我已经检测到并使用元素的 ID 进行点击等目的。但是,突然之间,这些 id 发生了变化,脚本不再起作用。 另一个奇怪的事情是这些 ID 在 Chrome 中检查时与脚本中的 ID 相同,但在 Firefox 驱动程序浏览器中不同。

测试驱动程序的萤火虫:-

<p class="description" onclick="selectElementTextListForIE(this,'tile29', 'tile19');selectElementTextList(this,'tile29', '')" id="tile29_span_0_0">
                                                            Platinum
                                                        </p>

同一元素的 Chrome 检查器:-

<p class="description" onclick="selectElementTextListForIE(this,'tile20', 'tile19');selectElementTextList(this,'tile20', '')" id="tile20_span_0_0">
                                                            Platinum
                                                        </p>

此外,检测此类在运行时生成 ID 的元素的最佳策略是什么。 我什至尝试使用 XPATH,但它也包含 id 的引用 例如。 @id="tile276_input

任何帮助将不胜感激。

谢谢。

阿布舍克

【问题讨论】:

  • 如果您能展示一个来自 Chrome 和 Firefox 的 HTML 示例,这样我们就可以看到差异,这样会更容易为您提供帮助。

标签: selenium dynamic automation detect


【解决方案1】:

您可以为此使用 CSS。对于您的元素,看起来像它:

<* id="tile276_input" />

您需要做的是找出它发生了哪些变化。我假设它是介于两者之间的数字。如果是,那么您的选择器将如下所示:

By.cssSelector("*[id^='tile'][id$='input']")

这将查找 ID 为“以tile 开头”和“以input 结尾”的任何内容。在我们的例子中,"tile276_input" 匹配。

如果您想了解更多信息,请参阅this article

【讨论】:

  • 但是有多个条目以相同的 ID 开头。示例: - browser.find_element(:id =>'tile20_span_0_0').click #Platinum browser.manage.timeouts.implicit_wait = 1 browser.find_element(:id =>'tile210').click #Ok button browser.manage.timeouts .implicit_wait = 1 #SELECT SERVICES browser.find_element(:id =>'tile45_span_3_0').click #Thermographic
  • 那么您需要更具体地使用您的选择器。了解父子后代层次结构如何与 CSS 一起使用,您将解决您的问题
  • @user007 - 如果你使用 Xpath ,你可以做复杂的选择器,包括获取一个元素然后获取它的父级,然后获取一个不同的子级......等等。你不需要通过 id .您可以通过 css 或 xpath 的相对位置获取元素。
【解决方案2】:

你也可以试试containsstarts-with()这样的事情

driver.findElement(By.xpath("//*[contains(@id,'title')]"))

driver.findElement(By.xpath("//* [start-with(@id,'title')]"))

【讨论】:

    【解决方案3】:
    WebElement element = driver.getElement(By.cssSelector("[id^='title']);
    

    或者

    WebElement element = driver.getElement(By.cssSelector("id:contains('title')"));
    

    您可以使用此元素执行所需的操作。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-11-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多