【问题标题】:Break with For loop in Java doesn't make the loop stop [closed]Java中的For循环中断不会使循环停止[关闭]
【发布时间】:2016-03-21 16:35:23
【问题描述】:

我有以下代码

    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 中找到值,我想退出循环,将它们与应用程序选项匹配并单击它们。

如您所见,我尝试将 break 放在 if 语句中,并在 if 语句之后立即尝试。但是没有任何工作它仍然继续循环遍历所有选项。

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

附:除了在动作完成后循环被打破之外,其他一切都在工作。

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

更新 1:代码更新

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

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

【问题讨论】:

  • 请编辑源代码并对其进行格式化,以便我们可以得到您发布的内容...
  • 你确定它真的进入了if吗?
  • 如果取消注释第二个breakfor 循环将只处理allopts 列表中的第一个元素,无论if 语句是否触发,这使得以下语句不可能:“它仍然继续循环遍历所有选项”
  • 没有足够的代码来查看问题。 if 条件是否为真? allopts 可能是空的吗?使用调试器或调试打印。尝试自动格式化源代码(Java IDE 通常具有“格式化”功能)以发现结构问题。
  • @Xoce웃Пepeúpa 代码已更新

标签: java excel loops selenium


【解决方案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;
    }
}

我不知道哪个性能更好,我认为是第二个,但我不确定。我用来写它们的顺序是它们出现在我脑海中的顺序。

【讨论】:

  • 你认为我添加的初始代码中的这个中断与 for 循环本身无关,它将应用程序中的所有选项存储在数组 List allopts = .... ?所以即使有休息,它也会继续?
  • 在这种情况下,我应该怎么做才能阻止数组在看到选项并选择它时立即捕获所有选项?
  • 在我的第二个选项中,如果你替换 flag=true;休息一下;应该可以工作,但你说它不工作,我不知道为什么,但我给你其他应该工作的选项,我不知道他们是否会工作,也许问题是另一个。
  • 在所有这些之前还有一个如果让我补充一下。
  • 我阅读了一些文档,我将添加第三个我认为正确的选项。
【解决方案2】:

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

【讨论】:

  • 它不适用于我的实际应用程序,编写代码的方式工作得非常好,除了代码在找到并选择元素后不会中断循环
  • 请看一下代码,现在有另一个父 if 语句。很抱歉,非常感谢
【解决方案3】:

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

由于您似乎表明您已经尝试将break 放在那里,我倾向于认为您提供的代码没有充分捕捉到问题。这可能是因为有另一个级别的循环没有被转义,因为您尝试插入的 breakswitch 语句中,或者因为 break 通过抛出稍后在循环。

【讨论】:

  • 代码更新了,非常感谢
  • @Ami,您在更新中所做的任何更改都不会改变我的分析。如果您想在识别和处理选项后跳出for 循环,那么您可以在处理后将break 语句放入if 块内。
  • 您是否认为代码中的这个中断与 for 循环本身无关,它将应用程序中的所有选项存储在数组 List allopts = .... 中?所以即使有休息它也会继续?在这种情况下,我应该怎么做才能停止数组以在看到选项并选择它时立即捕获所有选项?
  • 当执行到达未标记的break 语句时,它会从那里分支到最近的封闭循环(forwhiledo ... while)或@ 结束后的下一条语句987654338@。时期。如果您在您提供的代码中的if 块的末尾放置一个break,但观察循环运行直到它耗尽allopts 的内容,那么它就永远不会到达中断。
  • 您正在测试的类是否可能与您提供的代码不对应?例如,您是否可能在添加 break 后忘记重新编译和/或重新部署?
猜你喜欢
  • 1970-01-01
  • 2022-01-11
  • 1970-01-01
  • 1970-01-01
  • 2020-04-26
  • 2020-06-03
  • 2015-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多