如何在每次刷新时找到/找到ID和xpath发生变化的元素 - Selenium WebDriver Java

时间:2015-10-19 13:10:39

标签: java selenium xpath

我正在使用java工作selenium webdriver,我遇到了一个问题。我在页面上有一个字段,每次加载页面时,其id和xpath都会更改。就像,当我手动打开该页面时,我可以看到一些id和xpath,但是当我的测试运行时,id,xpath已经改变。 例如,

.//*[@id='dp1445259656810']
.//*[@id='dp1445260051638']
.//*[@id='dp1445260078674']
.//*[@id='dp1445260154173']

这些是每次刷新页面时创建的xpath。如何在运行测试期间找到/找到这样的元素。任何帮助将受到高度赞赏。

以下是该字段的HTML代码。

<div class="form-group event-date">
    <div class="input-group">
        <input id="dp1445260154173" class="form-control ng-pristine ng-
        untouched ng-valid ng-isolate-scope hasDatepicker" 
        enter-action="datePickerEnter(event)" allow-empty=""
        has-datepicker="" ng-model="eventSeries.newEvent.date" 
        placeholder="Event Date"/>

        <span class="input-group-addon">
            <i class="fa fa-calendar"/>
        </span>
    </div>
</div>

3 个答案:

答案 0 :(得分:3)

通常当ID或Class属性是动态的时,您需要使用:其他属性/依赖于静态标记来查找它们。

以下是在Gmail中查找“撰写”按钮的示例。它有: - 动态ID - 动态类 - 一个静态唯一属性

以下是HTML代码:

<div class="T-I J-J5-Ji T-I-KE L3" tabindex="0" role="button" style="-moz-user-select: none;" gh="cm">COMPOSE</div>

所以我的xpath将是:

//div[@gh='cm']

或者想象一下,你在Gmail上发送“发送消息”按钮。它有: - 动态ID - 动态类 - 一个静态唯一属性

HTML代码:

<div id=":ly" class="T-I J-J5-Ji aoO T-I-atl L3" tabindex="1" role="button" style="-moz-user-select: none;" data-tooltip="Send ‪(Ctrl-Enter)‬" aria-label="Send ‪(Ctrl-Enter)‬" data-tooltip-delay="800">Send</div>

此示例使用CSSselector:

[aria-label*='Enter)']

这里的规则是:当某些东西是动态的时候,通过使用静态作为参考来寻找它。

在你的情况下,它将是:

//div[@class="form-group event-date"]/input

如果您的div级不是动态的,则有效。

答案 1 :(得分:0)

您很可能需要根据文字获取。 Selenium允许根据文本定位元素。在Python绑定中有以下选择器方法:

  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_css_selector(如适用)

您只需在Java中找出相应的内容即可。

答案 2 :(得分:0)

没有更多的HTML我不知道这些有多具体,但我通常使用CSS选择器来做这样的事情。一些可能有帮助的例子......

一个更简单的选择器是div.form-group.event-date,它会查找包含(。)DIVform-group类的event-date

您可以使用类似div.form-group.event-date > div.input-group的内容查找父母和孩子,这些内容与上面的DIV相同,但{(1}}的孩子({1}}具有班级DIV

您还可以使用选择器input-group或使用带有选择器ng-model的{​​{1}}属性从相关INPUT中查找input[ng-model='eventSeries.newEvent.date']等HTML属性

如果仍然不够,你可以发疯并将一堆这些链接在一起以找到特定结构中非常具体的元素,例如: placeholder

尝试其中一些,看看是否有任何帮助。

网上有很多关于CSS选择器的优秀资源。谷歌一些,并了解更多关于他们。它们是在页面上查找元素的非常强大的工具。这是我经常使用的CSS参考:

http://www.w3.org/TR/selectors/#selectors

关于MDN的文章也非常好。

https://developer.mozilla.org/en-US/docs/Web/Guide/CSS/Getting_started/Selectors