我浏览了这个网站,但找不到解决我问题的方法,并且想知道在Selenium有更多经验的人是否可以帮助我。 为长篇文章道歉,但我想确保我正确地解释了事情。
我正在使用Java。我通常使用Rational Function Tester(Java),但我试图看看是否可以从一些测试中重写代码,看看转换是多么容易。
我有一个包含11列和4行的表(但它可能是20行或50行,它在测试期间会波动)。 我可以阅读表及其内容以找到我想要的行。我比较了前10个单元格值中的每一个,如果它们都匹配,我想点击第11列中的复选框。否则,继续下一行。
该函数可以正常检索每个单元格中的值。但是,当我尝试单击复选框时,它总是选择第一行上的那个。 当我检查属性时,我可以看到所有复选框都具有相同的“名称”但是具有不同的值(例如1330361,1330363,1330359等)。 有趣的是,如果我搜索行中的所有复选框,它会报告其中的4个(整个表中找到的数字,而不是行中的数字)。
我可能犯了一个非常基本的错误,但我无法弄清楚它是什么。
我使用以下代码在表中搜索。该函数接收表行,此时,我只是报告单元格值,然后尝试单击行中的复选框。它是一种调试功能。 我不确定发布大量代码是否合适,所以我只想放一个简短的版本,我尝试点击表格中的每个复选框。
// Passing a specific table row to the function:
List<WebElement> columns=myRow.findElements(By.tagName("td"));
for (int iLoop = 0;iLoop < columns.size();iLoop++)
{
System.out.println("Column " + iLoop + " : '" + columns.get(iLoop).getText().toString() + "'");
// code to compare actual and expected values and setting of a boolean variable.
if (iLoop == 10 && recordMatch)
{
tCheckbox = myRow.findElement(By.xpath("//input[@type='checkbox']"));
System.out.println("Value is :" + tCheckbox.getAttribute("value").toString());
tCheckbox.click();
}
答案 0 :(得分:0)
获取复选框的XPath将整个页面作为范围。我会在前面添加一个点来获得相对于元素的范围:
// Passing a specific table row to the function:
List<WebElement> columns=myRow.findElements(By.tagName("td"));
for (int iLoop = 0;iLoop < columns.size();iLoop++)
{
System.out.println("Column " + iLoop + " : '" + columns.get(iLoop).getText().toString() + "'");
// code to compare actual and expected values and setting of a boolean variable.
if (iLoop == 10 && recordMatch)
{
tCheckbox = myRow.findElement(By.xpath(".//input[@type='checkbox']"));
System.out.println("Value is :" + tCheckbox.getAttribute("value").toString());
tCheckbox.click();
}
}
但更好的方法是在迭代列之前收集所有复选框:
// Passing a specific table row to the function:
List<WebElement> columns=myRow.findElements(By.xpath("//td[.//input[@type='checkbox']]"));
List<WebElement> checkboxes=myRow.findElements(By.xpath("//td//input[@type='checkbox']"));
for (int iLoop = 0;iLoop < columns.size();iLoop++)
{
System.out.println("Column " + iLoop + " : '" + columns.get(iLoop).getText().toString() + "'");
// code to compare actual and expected values and setting of a boolean variable.
if (iLoop == 10 && recordMatch)
{
tCheckbox = checkboxes.get(iLoop);
System.out.println("Value is :" + tCheckbox.getAttribute("value").toString());
tCheckbox.click();
}
}
答案 1 :(得分:0)
如果要根据值单击复选框,则必须使用for循环列出所有值,并选中复选框绝对xpath并传递&#34; i&#34;值, 请参阅以下代码:
WebElement table = driver.findElement(By.xpath("//div[@id ='content']/table"));
/*List <WebElement> head = driver.findElements(By.tagName("th"));
head.size();
for (int h=0;h<head.size();h++){*/
List <WebElement> row = driver.findElements(By.tagName("tr"));
row.size();
for (int i=0;i<row.size();i++){
List <WebElement> col = row.get(i).findElements(By.tagName("td"));
col.size();
for (int j=0;j<col.size();j++){
String cv = col.get(j).getText();
// If name is Saudi Arabia, it will click on check box
if(cv.equalsIgnoreCase("Saudi Arabia")){
// Divide the x path where colunm is changing html/body/div[1]/div[5]/div[2]/div/div/table/tbody/tr[pass i value]/td[6]";
String xp1 = "html/body/div[1]/div[5]/div[2]/div/div/table/tbody/tr[";
String xp2 = "]/td[6]";
// Pass the i value xp1+i+xp2
driver.findElement(By.xpath(xp1+i+xp2)).click();
}
System.out.println(cv);
}
}