2016-03-21 95 views
-1

我有以下代码以打破在Java循环不会使循环停止

File src = new File("C:\\Users\\Excel Files\\XLFile.xlsx"); 

    FileInputStream fis = new FileInputStream(src); 
    XSSFWorkbook wb = new XSSFWorkbook(fis); 
    XSSFSheet sh1 = wb.getSheetAt(0); 

    // Start 
    String chromePath = "C:\\Users\\chromedriver_win32\\chromedriver.exe"; 
    System.setProperty("webdriver.chrome.driver", chromePath); 

    WebDriver driver = new ChromeDriver(); 
    driver.manage().window().maximize(); 

    // UAT 
    driver.get("http://www.htmlcodetutorial.com/forms/_SELECT_MULTIPLE.html"); 
    //Building Action Interaction 
    Actions act = new Actions(driver); 

    if (sh1.getRow(0) !=null && sh1.getRow(0).getCell(1) !=null) { 
    List<WebElement> allopts = driver.findElements(By.xpath("//select[@name='toppings']//option")); 

    List<String> xlall= new ArrayList<String>(); 

    Iterator<Row> ixlrows = sh1.rowIterator(); 

    while (ixlrows.hasNext()) 
    { 
     Row row= ixlrows.next(); 

     if (row.getRowNum() > 0 && row.getCell(1) != null) 
     { 
      xlall.add(row.getCell(1).getStringCellValue()); 
     } 
    } 

    for (WebElement we : allopts) 
    { 
     if (xlall.contains(we.getText())) 
     { 
      act.keyDown(Keys.CONTROL) 
        .click(we) 
        .keyUp(Keys.CONTROL) 
        .build() 
        .perform(); 
     } 
    } 
} 
    wb.close(); 
    fis.close(); 

我做什么是通过匹配从Excel里的值,并将它们与应用程序选项将选择匹配他们一个接一个。

这只是一个示例代码,实际代码有1003个选项,这个循环必须经过。只要找到excel中的值,我就想退出循环,并将它们与应用程序选项匹配并点击它们。

正如你所看到的,我已经尝试在if语句中放置break,并在if语句后尝试。但没有任何作品,它仍然在循环所有选项。

我在哪里添加中断来做到这一点?

P.S.除了循环在动作完成后被破坏以外,其他的都在工作。

P.S 2.这是使用Java的Selenium WebDriver代码的一部分。

更新1:代码更新

更新2:有没有人觉得这个突破在此代码无关与for循环本身,它存储所有从数组列表中的应用程序选项allopts = ... 。?所以即使有休息,它也会继续进行下去吗?在那种情况下,我应该做些什么来阻止阵列在看到选项并选择它时立即捕获所有选项?

UPDATE 3:还有另一条if语句。该代码已更新与父母如果语句。

编辑:最后用@DonLeopardo的帮助下,像变魔术一样,

这里是工作代码:

if (sh1.getRow(0) !=null && sh1.getRow(0).getCell(1) !=null) { 
    List<WebElement> allopts = driver.findElements(By.xpath("//select[@name='toppings']//option")); 

    List<String> xlall= new ArrayList<String>(); 

    Iterator<Row> ixlrows = sh1.rowIterator(); 

    while (ixlrows.hasNext()) 
    { 
     Row row= ixlrows.next(); 

     if (row.getRowNum() > 0 && row.getCell(1) != null) 
     { 
      xlall.add(row.getCell(1).getStringCellValue()); 
     } 
    } 

List<String> copy = new ArrayList<>(xlall) 

WebElement we; 
for(int i=0;i<allopts.size();i++) 
{ 
    we=(WebElement)allopts.get(i); 
    if (copy.contains(we.getText())) 
    { 
     act.keyDown(Keys.CONTROL) 
       .click(we) 
       .keyUp(Keys.CONTROL) 
       .build() 
       .perform(); 
     copy.remove(copy.indexOf(we.getText())); 
    } 
    if(copy.size()<1) 
    { 
     break; 
    } 
} 
+2

请编辑源代码并对其进行格式化,以便我们可以得到您正在发布的内容...... –

+0

您确定它实际上进入了if吗? – DonLeopardo

+0

如果取消注释第二个'break','for'循环只会处理'allopts'列表中的第一个元素,而不管if语句是否触发,这使得下面的语句不可能:*“它仍然保留在循环所有选项“* – Andreas

回答

1

你可以尝试这个选项,但我不知道他们是否会工作,因为最初的代码应该工作。 选项1:

boolean flag=true; 
int i=0; 
while(i<allopts && flag) 
{ 
if(conditons)//Put your conditions 
{ 
//code 
flag=false; 
} 
i++; 
} 

选项2:

boolean flag=false; 
for (WebElement we:allopts) 
{ 
if (condition)//Put your conditions 
{ 
//code 
flag=true; 
} 
if(flag) 
{ 
break; 
} 
} 

编辑: 方案3:(这个应该工作)

WebElement we; 
for(int i=0;i<allopts.size();i++) 
{ 
we=(WebElement)allopts.get(i); 
if (condition)//Put your conditions using we like always: xlall.contains(we.getText()) 
    { 
    //code 
    break; 
    } 
} 

我看,你不能停止foreach或类似的东西。

编辑2:我认为我现在正确地理解了这个问题。 你应该这样做:

List<String> allStrOpts=new ArrayList<String>(); 
for (WebElement we : allopts) 
{ 
    allStrOpts.add(we.getText()); 
} 
for(int i=0;i<xlall.size();i++) 
{ 
    if(allStrOpts.contains(xlall.get(i)) 
    { 
      act.keyDown(Keys.CONTROL) 
       .click(allopts.get(allStrOpts.indexOf(xlall.get(i)))) 
       .keyUp(Keys.CONTROL) 
       .build() 
       .perform(); 
    } 
} 

如果这需要大量的时间,你可以试试这个:

//List<String> copy=xlall.clone(); 

//or 

List<String> copy = new ArrayList<>(xlall) 

WebElement we; 
for(int i=0;i<allopts.size();i++) 
{ 
    we=(WebElement)allopts.get(i); 
    if (copy.contains(we.getText())) 
    { 
     act.keyDown(Keys.CONTROL) 
       .click(we) 
       .keyUp(Keys.CONTROL) 
       .build() 
       .perform(); 
     copy.remove(copy.indexOf(we.getText())); 
    } 
    if(copy.size()<1) 
    { 
     break; 
    } 
} 

我不知道哪一个具有更好的性能比较,我认为第二个,但我不确定。我用来写他们的顺序是他们想到的顺序。

+0

您认为我添加的初始代码中的这个中断与for循环本身无关,它将应用程序中的所有选项存储在数组列表中 allopts = ....?所以即使有休息,它也会继续进行下去吗? – Ami

+0

在那种情况下,我应该做些什么来阻止阵列在它看到选项并选择它时立即捕获所有选项? – Ami

+0

在我的第二个选项中,如果替换flag = true;休息一下;应该可以工作,但是你说它没有工作,我不知道为什么,但是我给你提供了其他应该工作的选项,我不知道他们是否会工作,也许问题是另一个。 – DonLeopardo

0

硒有Select类,你可以用它来选择的选项

WebElement selectElement = driver.findElement(By.name("toppings")); // find the <select> tag 
Select select = new Select(selectElement); // initialize Select instance 

for (WebElement we : allopts) { 
    if (xlall.contains(we.getText())) { 
     select.selectByVisibleText(we.getText()); 
    } 
} 
+0

它不适用于我的实际应用程序,代码编写的方式工作得非常好,除非代码在找到并选择元素后不会中断循环 – Ami

+0

请看看代码现在有另一个父母如果声明。对不起,感谢很多 – Ami

0

在您提供的代码中,您应该在if声明中放置break 。如果if的测试评估结果为true,并且if块中较早的方法都不引发异常,则break将跳出最近的封闭循环(或switch)。当然,一个异常也会导致执行离开你的示例代码中的循环。

由于您似乎已经表明您已经尝试过在其中放置break,所以我倾向于认为您提供的代码没有充分地捕获问题。这可能是因为还有另一个循环级别没有转义,因为您试图插入的break位于switch语句内,或者因为抛出稍后在循环中捕获的异常而忽略了break

+0

代码更新,非常感谢 – Ami

+0

@Ami,你的更新没有任何改变改变了我的分析。如果你想在识别和处理一个选项后突破'for'循环,那么你可以在处理完成后在'if'块中加入一个'break'语句来实现。 –

+0

您认为代码中的这个中断与for循环本身无关,它将数组中的所有选项都存储在数组中list allopts = ....?所以即使有休息,它也会继续进行下去吗?在那种情况下,我应该做些什么来阻止阵列在看到选项并选择它时立即捕获所有选项? – Ami