Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/loops/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
迭代具有相同属性的输入对象集合:Java Selenium Webdriver_Java_Loops_Selenium_Collections_Webdriver - Fatal编程技术网

迭代具有相同属性的输入对象集合:Java Selenium Webdriver

迭代具有相同属性的输入对象集合:Java Selenium Webdriver,java,loops,selenium,collections,webdriver,Java,Loops,Selenium,Collections,Webdriver,我已经尝试了这里已经提供的一些迭代示例,但是我还不能迭代输入字段集合,所有这些字段都具有相同的标识属性:,和 我需要迭代所有这些对象,并向每个对象添加相同的字符串。 以下代码将字符串分配给输入字段的第一个实例,但不会转移到下一个实例: List<WebElement> allSumInsuredFields = driver.findElements(By.id("ctl00__txtSumInsured")); Iterator<WebElement> itr = al

我已经尝试了这里已经提供的一些迭代示例,但是我还不能迭代输入字段集合,所有这些字段都具有相同的标识属性:,和

我需要迭代所有这些对象,并向每个对象添加相同的字符串。 以下代码将字符串分配给输入字段的第一个实例,但不会转移到下一个实例:

List<WebElement> allSumInsuredFields = driver.findElements(By.id("ctl00__txtSumInsured"));
Iterator<WebElement> itr = allSumInsuredFields.iterator();
while(itr.hasNext()){

    if (driver.findElement(By.id("ctl00_txtSumInsured")).getText().equals("")) ;
        driver.findElement(By.id("ctl00_txtSumInsured")).sendKeys("£250000");

    itr.next(); 
}
List allsumsuminsuredfields=driver.findElements(By.id(“ctl00_uutxtsuminsured”);
迭代器itr=allsumsuredfields.Iterator();
while(itr.hasNext()){
if(driver.findelelement(By.id(“ctl00_txtsuminsurated”)).getText()等于(“”);
驱动程序。findElement(通过身份证(“ctl00”)发送钥匙(“250000英镑”);
itr.next();
}

不需要使用额外的迭代器

By byId = By.id("ctl00__txtSumInsured");

//Explicit wait just to make sure the elements are loaded properly
(new WebDriverWait(driver, 10))
  .until(ExpectedConditions.presenceOfElementLocated(byId));

List<WebElement> allSumInsuredFields = driver.findElements(byId);

//Now iterate through List and do whatever you want
for(WebElement ele:allSumInsuredFields)
{
  if(ele.getAttribute("value").equals(""));        
  ele.sendKeys("something");

}

我会这样处理:

C#


如果Java语法不正确,我深表歉意,但您明白了我的目的。

代码的主要问题是,在循环中,您使用
driver.findElement
获取要处理的元素。这不仅会做额外的工作,而且会使您的算法不正确。
findElement
方法(单数形式)返回找到的第一个元素。因此,在您的代码中,不管循环迭代多少次,它总是使用您想要的id对第一个元素进行操作

正如Saifur提到的,您应该使用
getAttribute(“value”)
来获取
input
元素的值。所以你需要这样的东西:

for(WebElement el : driver.findElements(By.id("ctl00__txtSumInsured"))) {
    if (el.getAttribute("value").equals(""))        
        el.sendKeys("something");
}

与Saifur相反,我并不是建议您在此循环之前使用显式等待。您是否需要它,以及它应该采取什么形式,实际上取决于正在测试的应用程序。你在这个问题上说得不够多,无法做出这个决定。额外的、不必要的检查并不是无害的:它会使Selenium脚本变慢。如果您养成了进行不必要检查的习惯,可以在脚本中添加几分钟的运行时间。而一张没有检查正确的东西的支票实际上是有害的

DOM中的
id
属性应该是唯一的。您确定所有元素都具有相同的
id
?抱歉,出错了。SumInsurated字段的每个实例都有一个唯一的id:ctl00_wnCore_rptCoverageSelections_ctl01_UnitContainerControl1_ctl00_AnimalDetailInputPanel_TXTSUMInsurated显示ctl01的零件对于该字段的每个实例都会变成ctl02、ctl03等。问题是,我事先不知道这个字段会有多少个实例。OP已经标记了java。用java编写的脚本会更好。
List<IWebElement> allSumInsuredFields = driver.findElements(By.Id("ctl00__txtSumInsured"));

foreach (var element in allSumInsuredFields)
   {
       if (string.IsNullOrEmpty(element.Text))
       {
           element.SendKeys("£250000");
       }
    }
for(WebElement element : allSumInsuredFields)     
           if (element.getAttribute("value") != null && 
              !element.getAttribute("value").isEmpty())
           {
               element.sendKeys("£250000");
           }
for(WebElement el : driver.findElements(By.id("ctl00__txtSumInsured"))) {
    if (el.getAttribute("value").equals(""))        
        el.sendKeys("something");
}