繁体   English   中英

如何使用 Selenium 和 Java 在 webtable 单元格中发送文本

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM