【问题标题】:How to handle more than one element on Page with same xpath如何使用相同的 xpath 处理 Page 上的多个元素
【发布时间】:2017-11-28 16:04:15
【问题描述】:

我在页面上有多个元素具有相同的 xpath 和相同的 id/name , 页面上有两个具有相同定位器的字段我尝试使用以下代码在所需位置输入值

element.all(by.xpath('//*[@id="testInstanceScan"]')).get(1).sendKeys('Vkumar');

但我遇到了错误消息:

失败:索引超出范围。尝试访问索引处的元素:1,但只有 1 个元素与定位器 By(xpath, //*[@id="testInstanceScan"] )

如果我用过 element.all('#testInstanceScan').get(1).sendKeys('Vkumar');

我遇到了错误

失败:定位器无效 堆: TypeError: 定位器无效

Xpath:

 //*[@id="TubeExpirationDate"]

请给我建议。

【问题讨论】:

  • 请贴出你试过的代码和相关的html。
  • var expDate= browser.findElement(by.xpath('//*[@id="TubeExpirationDate"]')); expDate.clear(); expDate.sendKeys('11252017'); browser.driver.sleep(4000);我正在尝试在提交日期中输入日期,并使用相同的 xpath('//*[@id="TubeExpirationDate"]')
  • 您想为所有元素输入相同的值吗?此外,如果您通过编辑答案(包括上面的代码)来回复,也会更容易阅读。
  • 您好,感谢您的快速回复,如果我能识别出相同的元素,我可以输入所需的值,无论它是重复的还是重复的

标签: node.js jasmine protractor


【解决方案1】:

在 Protractor API 页面上检查 element.all()filter()each() 之类的 cssContainingText()

改进您的代码(这不起作用):

for (var i=1;element.all(by.xpath('//*[@id="TubeExpirationDate"]')).c‌​ount();i++ ){
    element.all('//*[@id="TubeExpirationDate"]').get(i).clear;
    element.all('//*[@id="TubeExpirationDate"]').get(i).sendKeys‌​('11252017');
    browser.driver.sleep(2000);
}

试试这个例子:

let j = 0;
let entries = ['july', 'august', 'september', 'restOfYear'];
$$('#TubeExpirationDate').each(function(elem){
    elem.clear().sendKeys('11'+entries[j]+'2017');
    j++;
    //browser.sleep(2000); //I suggest not to use browser.sleep at all
})

但最好通过using CSS Selectors 清楚地确定您要发送输入的确切对象,以进行唯一标识。如:

let elemGroup = $$('#TubeExpirationDate');
elemGroup.$('div[indiv-index ="0"]').clear().sendKeys('11-01-2017');
elemGroup.$('div[indiv-index ="1"]').clear().sendKeys('11-02-2017');
//or if you want to use a counter-variable
elemGroup.$('div[indiv-index ="'+j+'"]').clear().sendKeys('11'+entries[j]+'2017');

但正如我已经建议的那样,还要对Protractortest.org 进行一些研究......那里有很多很好的解释和示例。

【讨论】:

  • @ Ernst Zwingli 感谢您的建议,使用上面的代码,我可以在每个元素中输入值,但是从我的代码(不起作用)中,我想为每个元素输入不同的值元素。比如 var j=i+3 element.all('//*[@id="TubeExpirationDate"]').get(i).sendKeys‌​('11'+j+'2017');有没有其他类似的输入方式。
  • @vijaykumar :改进了我的答案。这些东西没有火箭科学,所以也借此机会通过 protractortest.org 了解自己。
【解决方案2】:

你需要使用element.all(locator).each(eachFunction),类似于这个postelement.all() 返回由公共定位器标识的元素的列表。 .each() 然后循环遍历该列表。传递给.each()function(element, index) 使您可以访问每个元素及其索引。

element.all(by.id('TubeExpirationDate')).each(function(element, index) {
    element.clear();
    var date = index + 3;
    element.sendKeys('11' + date + '2017');
});

正如其他人所建议的,protractortest.org 是一个很好的资源,可以花时间查看。

【讨论】:

  • 您好,我尝试使用元素,但我的应用程序没有在下面启动是我正在使用的代码 for(var i=1;element.all(by.xpath('//*[@id ="TubeExpirationDate"]')).count();i++){ element.all('//*[@id="TubeExpirationDate"]').get(i).clear; element.all('//*[@id="TubeExpirationDate"]').get(i).sendKeys('11252017'); browser.driver.sleep(2000); } 及以下是:Tube Lot Exp。日期 [................] [................] [............ ....] 我无法附上屏幕截图,所以试图显示所需的字段
  • 编辑了我的答案,更清楚地说明并添加了一行来修改 sendKey 值
猜你喜欢
  • 2022-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多