【问题标题】:Python Selenium find element with dynamic IDPython Selenium 查找具有动态 ID 的元素
【发布时间】:2021-09-20 10:19:42
【问题描述】:

我设计了一个 Python 脚本,它删除了一个网站并填写了一些关于用户的详细信息。这很容易,因为该网站为我需要的每个元素提供了一个特定的 ID。现在,他们部署了一个更新,该更新改变了界面,所有文本框都有动态 ID(它们之间的 ID 不同,并且在页面刷新时它们会发生变化)。

我尝试搜索 CSS 选择器,但不起作用。 FULL XPATH 没有用,因为如果他们更改 div 或其他内容,则不会有任何效果。我也找不到他们的文字...这是他们的页面和 HTML 代码

我需要填写First Name/Last Name/Email,但是你可以看到它们有相同的TYPE,相同的CLASS,并且它们的ID是随机的,都是以输入开头的。

我设法找到第一个,输入一些文本,然后按 X 选项卡循环浏览它们。

browser.find_element_by_class_name('input').send_keys('MICHAEL')
actions.send_keys(Keys.TAB)
actions.perform()
actions.send_keys('FULKE')
actions.perform()

有什么方法可以直接指向特定的文本字段?我不能只使用 TAB 循环浏览它们(也许它们会改变位置/顺序)...

任何帮助将不胜感激

【问题讨论】:

  • 可能是xpath索引可以帮助我们,请以文本格式分享HTML以供进一步分析。
  • 你能发布 HTML 而不是图片吗?
  • 我做到了。我为这个问题添加了一条新评论。

标签: python selenium element


【解决方案1】:

<div class="form-field__label" data-v-78510568=""> First Name <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_vlcbo61z5" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Website <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_umpb7xvn9" type="text" class="input" placeholder="www.website.com" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Last Name <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_g9tlbt7dt" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Phone <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_sfurpm31l" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Email <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_75ko5w3cw" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Fax <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_noz2c1g4a" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><div class="form-field__label" data-v-78510568=""> Job Title <!----></div><div class="form-field__control" data-v-78510568=""><input id="input_w7p0iec5u" type="text" class="input" data-v-728ea34e="" data-v-5890f98b=""></div><!----></div></div></div><h2 class="text text_h2 user__add-subtitle" data-v-73655104="" data-v-5890f98b="">Groups</h2><div class="grid-container" data-v-963e69fe="" data-v-5890f98b=""><div class="grid-item grid-item-xl-6" data-v-963e69fe="" data-v-5890f98b=""><div class="form-field" data-v-78510568="" data-v-5890f98b=""><!----><div class="form-field__control" data-v-78510568=""><div class="input-tags" data-v-2af32715="" data-v-5890f98b=""><div class="input-tags__field" data-v-2af32715=""><input id="input-tags_folh9wox7" type="text" placeholder="" autocomplete="off" class="input-tags__control" data-v-2af32715=""></div></div></div><!----></div>

我找到了一种方法:使用 browser.find_elements_by_class_name 然后使用该列表抓取 [0]、[2]、[4](它们是 FirstName /LastName/Email)...但又一次,这太疯狂了?!

【讨论】:

    【解决方案2】:

    有很多方法可以做到这一点。 使用动态 ID 的最佳方式是......不使用动态 ID。 这是我们在自动化 UI 测试用例时经常提出的要求。

    但是,可能有一些是动态的。在这些情况下,最好使用几乎不需要维护的稳定定位器。

    我们如何做到这一点?

    模式匹配特定属性

    //div[contains(@text,'First Name')]/../div[contains(@class,'control')]/input
    

    这会选择包含匹配文本的 div,上升一个元素(必须匹配每个特定元素的文本字段,假设它们遵循类似的结构),然后匹配控件内的输入。

    将所有元素分组并按页面中的位置循环

    您可以获取所有输入,然后循环它们:)

    (//input)[0] # will select the first index (First Name), [1] second, etc.
    

    【讨论】:

      猜你喜欢
      • 2012-04-13
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2022-07-28
      • 2021-12-30
      • 1970-01-01
      • 2012-05-28
      • 1970-01-01
      相关资源
      最近更新 更多