![](/img/trans.png)
[英]How to validate text length for webtable fields inside particular column using Selenium Java?
[英]How to send text within a webtable cell using Selenium and Java
我正在尝试将值“100”发送到表的 Position (row: 2, column 3)
,这里:
https://keisan.casio.com/exec/system/13800848854767
使用下面的代码,你能告诉我,有什么问题吗?
代码:
driver.get("https://keisan.casio.com/exec/system/13800848854767");
List<WebElement> inputTable = driver.findElements(By.xpath("//*[@id='var_a_EXL']//tbody//tr"));
System.out.println(inputTable.size());
List<WebElement> columns;
for (int rows = 0; rows < inputTable.size(); rows++) {
if (rows == 2) {
columns = inputTable.get(rows).findElements(By.tagName("td"));
for (int i = 0; i < columns.size(); i++) {
if (i == 3) {
columns.get(i).clear();
columns.get(i).sendKeys("100");
}
}
}
}
您的循环逻辑是正确的,但您的代码会产生此错误:
org.openqa.selenium.InvalidElementStateException: invalid element state
您需要先click
,然后再对该元素执行下一个操作以成为可编辑元素,并且您必须使用Actions
class 与之交互:
driver.get("https://keisan.casio.com/exec/system/13800848854767");
List<WebElement> inputTable = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfAllElementsLocatedBy(By.xpath("//*[@id='var_a_EXL']//tbody//tr")));
System.out.println(inputTable.size());
List<WebElement> columns;
for (int rows = 0; rows < inputTable.size(); rows++) {
if (rows == 2) {
columns = inputTable.get(rows).findElements(By.tagName("td"));
for (int i = 0; i < columns.size(); i++) {
if (i == 3) {
WebElement target = columns.get(i);
Actions actions = new Actions(driver);
actions.moveToElement(target)
.click(target)
.sendKeys("100")
.build()
.perform();
}
}
}
}
我还在上面的代码中添加了WebDriverWait
。
导入后:
import org.openqa.selenium.interactions.Actions;
import org.openqa.selenium.support.ui.ExpectedConditions;
import org.openqa.selenium.support.ui.WebDriverWait;
顺便说一句 xpath //*[@id='var_a_EXL']//tbody//tr[3]//td[4]
有一种更简单的方法,而不是使用上面的循环:
driver.get("https://keisan.casio.com/exec/system/13800848854767");
WebElement target = new WebDriverWait(driver, 20).until(ExpectedConditions.visibilityOfElementLocated(By.xpath("//*[@id='var_a_EXL']//tbody//tr[3]//td[4]")));
Actions actions = new Actions(driver);
actions.moveToElement(target)
.click(target)
.sendKeys("100")
.build()
.perform();
或者使用以下 css 选择器来更好地定位元素:
By.cssSelector("#var_a_EXL tr:nth-child(3) td:nth-child(4)")
+1 @frianH 的回答,您的代码不起作用的原因是.clear()
仅在元素是文本输入元素时才有效。 文本输入元素是 INPUT 和 TEXTAREA 这不是您的情况
这是使用 JSExecutor 的更简单方法
List<WebElement> inputTable = driver.findElements(By.xpath("//*[@id='var_a_EXL']//tbody//tr"));
System.out.println(inputTable.size());
List<WebElement> columns;
int rowss = 3;
int columnss = 3;
for (int rows = 0; rows < inputTable.size(); rows++) {
if (rows == rowss) {
columns = inputTable.get(rows).findElements(By.tagName("td"));
System.out.println(columns.size());
for (int i = 0; i < columns.size(); i++) {
if (i == columnss) {
JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("arguments[0].innerText = '300'", columns.get(i));
}
}
}
}
你还没有提到你面临的错误。 提及错误将有助于我们构建一个更规范的答案。 当您尝试在<td>
元素上调用clear()
时,您可能正面临InvalidElementStateException
。
但是,要将字符串100发送到表的 position(行:2,z 列)中,您需要为elementToBeClickable()
引入WebDriverWait ,并且可以使用以下定位器策略:
使用xpath :
driver.get("https://keisan.casio.com/exec/system/13800848854767"); new WebDriverWait(driver, 5).until(ExpectedConditions.elementToBeClickable(By.xpath("//td/span[@id='var_a_EXL_2_3C']"))).click(); new WebDriverWait(driver, 5).until(ExpectedConditions.elementToBeClickable(By.xpath("//td/input[@id='var_a_EXL_2_3_input']"))).sendKeys("100");
浏览器快照:
将row
号和column
号视为变量:
代码块:
driver.get("https://keisan.casio.com/exec/system/13800848854767"); int row = 2; int column = 3; new WebDriverWait(driver, 5).until(ExpectedConditions.elementToBeClickable(By.xpath("//td/span[contains(@id, '"+String.valueOf(row)+"') and contains(@id, '"+String.valueOf(column)+"')]"))).click(); new WebDriverWait(driver, 5).until(ExpectedConditions.elementToBeClickable(By.xpath("//td/input[contains(@id, '"+String.valueOf(row)+"') and contains(@id, '"+String.valueOf(column)+"')]"))).sendKeys("100");
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.