在Java中使用For循环断开并不会使循环停止

时间:2016-03-21 16:35:24

标签: java excel loops selenium

我有以下代码

    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的值后立即离开循环,将它们与app选项匹配并点击它们。

正如你所看到的那样,我尝试将break放在if语句中并在if语句之后尝试。但没有一个工作,它仍然在循环所有选项。

我在哪里添加休息时间呢?

P.S。除了在完成操作后断开循环之外,其他所有工作都正常。

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

更新1:代码已更新

更新2:有没有人认为此代码中的这个中断与for循环本身无关,它存储了数组列表中所有选项列表allopts = ....?所以即使休息一下,它仍在继续?在这种情况下,我应该怎么做才能在看到选项并选择它时立即停止数组捕获所有选项?

更新3:还有另一个if语句。代码已使用parent 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;
    }
}

3 个答案:

答案 0 :(得分:1)

你可以尝试这个选项,但我不知道它们是否会起作用,因为初始代码应该有用。 选项1:

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

选项2:

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;
    }
}

修改 选项3 :(这应该有效)

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();
     }
}

我读到你无法阻止foreach或类似的东西。

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

//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;
    }
}

如果这需要很多时间,你可以试试这个:

nav.navbar.navbar-default.navbar-fixed-top
  .container
    .navbar-header
      button.navbar-toggle[type="button" data-toggle="collapse" data-target=".navbar-collapse"]
        span.sr-only Toggle navigation
        span.icon-bar
        span.icon-bar
        span.icon-bar
      = link_to root_path,class: 'navbar-brand' do
        .img-responsive
          =image_tag "logowhite2.png"
    .collapse.navbar-collapse
      # this part should be centered
      ul.nav.navbar-nav
        li#fat-menu.dropdown.text-center
          a.dropdown-toggle data-toggle="dropdown" href="#"
            | Users
            b.caret
          ul.dropdown-menu
            li = link_to 'Clients', clients_path
            li = link_to 'Trainers', trainers_path
            li = link_to 'Admins', admins_path
            li = link_to 'Companies', companies_path
        li = link_to 'Bookings', bookings_path
        li = link_to 'New Booking', book_user_path
        li = link_to 'Courses', courses_path

      # this part should pull to the right
      - if user_signed_in?
        ul.nav.navbar-nav.navbar-right
          li#fat-menu.dropdown
            a.dropdown-toggle data-toggle="dropdown" href="#"
              =current_user.name.capitalize
              b.caret
            ul.dropdown-menu
              li = link_to 'Sign out', destroy_user_session_path, :method=>'delete'
      - else
        li = link_to 'Sign in', new_user_session_path

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

答案 1 :(得分:0)

Selenium有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());
    }
}

答案 2 :(得分:0)

在您提供的代码中,您可以将中断放在if语句中。如果if的测试评估为true,并且if块中前面没有任何方法抛出异常,则break将突破最近的封闭循环(或switch)。当然,异常也会导致执行将循环留在示例代码中。

因为你似乎表明你已经尝试在那里放break,我倾向于认为你提供的代码没有充分地解决问题。这可能是因为还有另一级别的循环未被转义,因为您尝试插入的break位于switch语句中,或者因为抛出异常来绕过break这是在循环中稍后发现的。