通过Selenium Webdriver处理一直有变化ID的元素

时间:2014-03-31 17:01:59

标签: selenium dynamic automation detect

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

测试驱动程序的Firebug: -

<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

任何帮助将不胜感激。

感谢。

阿布舍克巴克

3 个答案:

答案 0 :(得分:8)

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

<* id="tile276_input" />

您需要做的是找出有关它的变化。我猜它是中间的数字。如果是,则您的选择器看起来像:

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

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

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

答案 1 :(得分:1)

你也可以尝试starts-with()driver.findElement(By.xpath("//*[contains(@id,'title')]")) 来做这些事情

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

>>> dct = {'a':'vala', 'b':'valb'}
>>> ','.join('{}={!r}'.format(k, v) for k, v in dct.items())
"a='vala',b='valb'"

答案 2 :(得分:0)

WebElement element = driver.getElement(By.cssSelector("[id^='title']);

或者

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

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