【发布时间】: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吗?
-
如果取消注释第二个
break,for循环将只处理allopts列表中的第一个元素,无论if语句是否触发,这使得以下语句不可能:“它仍然继续循环遍历所有选项” -
没有足够的代码来查看问题。 if 条件是否为真? allopts 可能是空的吗?使用调试器或调试打印。尝试自动格式化源代码(Java IDE 通常具有“格式化”功能)以发现结构问题。
-
@Xoce웃Пepeúpa 代码已更新