Java 无法替换表列中的值

Java 无法替换表列中的值,java,selenium,settext,Java,Selenium,Settext,无法发送表列中的值。在尝试使用Selenium在列中插入值时,出现了不同的错误 我试图在表的列中设置一个新值。它显示错误,因为元素必须是用户可编辑的才能清除它 WebElement.clear(); WebElement.sendKeys("value"); (or) WebElement.sendKeys(Keys.DELETE); WebElement.sendKeys("value"); 然后单击并编辑该值 Actions actions = new Actions(getWe

无法发送表列中的值。在尝试使用Selenium在列中插入值时,出现了不同的错误

  • 我试图在表的列中设置一个新值。它显示错误,因为元素必须是用户可编辑的才能清除它

    WebElement.clear();
    WebElement.sendKeys("value");
    
      (or)
    
    WebElement.sendKeys(Keys.DELETE);
    WebElement.sendKeys("value");
    
  • 然后单击并编辑该值

    Actions actions = new Actions(getWebDriverEx());
    WebElement TableColumn = Driver.findElement(By.id("element"));
    actions.moveToElement(TableColumn);
    actions.click().build().perform();
    actions.sendKeys(Keys.BACK_SPACE+b+b);
    actions.sendKeys("value");
    
    传递的值未插入表列中。但是我可以单击Tables列。我的考试通过了

  • 然后尝试设置值。它将错误显示为超时

     WebElement.sendKeys(Keys.DELETE);
     WebElement.sendKeys("15000");
    
  • 我再次使用div/span组合作为XPath,并编辑了该值。但这并没有反映在表中

    JavascriptExecutor js = (JavascriptExecutor) getDriver();
    js.executeScript("document.getElementById('element').innerHTML="+15000); 
    
  • 在这里我没有得到任何错误。但保存后未反映该值

    我给元素添加了各种格式

  • div/[id]
  • div//span
  • XPath
  • 仅id(在div中)
  • HTML:

    
    5000
    
    根据您共享的
    HTML
    ,表格列位于一个
    内,该列位于多个
    标记内。因此,我们需要构造一个唯一的
    xpath
    来识别
    ,首先发送
    clear()
    方法,然后使用
    sendKeys()
    方法,如下所示:

    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span[text()='5000']")).clear();    
    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span[text()='5000']")).sendKeys("15000");
    
    更新
    正如您提到的,在span中传递的
    文本是不可预测的
    ,因此我们只需省略子句
    [Text()='5000']
    。由于您提供了带有示例
    classnames
    的示例
    HTML
    ,我构建了一个几乎绝对的
    xpath
    。因此,我们的准则是:

    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span")).clear();    
    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span")).sendKeys("15000");
    

    根据您共享的
    HTML
    ,表列位于一个
    内,该标签位于多个
    标记内。因此,我们需要构造一个唯一的
    xpath
    来识别
    ,首先发送
    clear()
    方法,然后使用
    sendKeys()
    方法,如下所示:

    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span[text()='5000']")).clear();    
    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span[text()='5000']")).sendKeys("15000");
    
    更新
    正如您提到的,在span中传递的
    文本是不可预测的
    ,因此我们只需省略子句
    [Text()='5000']
    。由于您提供了带有示例
    classnames
    的示例
    HTML
    ,我构建了一个几乎绝对的
    xpath
    。因此,我们的准则是:

    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span")).clear();    
    driver.findElement(By.xpath("//div[@id='element']/div[@class='class_name']/div[@class='class_name']/div[@class='class_name']/span")).sendKeys("15000");
    

    试试下面的,它对我有用:

    js = "document.querySelector('#element .class_name .class_name .class_name>span').innerHTML = '15000';"
    driver.execute_script(js)
    

    希望它能帮助你

    试试下面这些,它对我很有用:

    js = "document.querySelector('#element .class_name .class_name .class_name>span').innerHTML = '15000';"
    driver.execute_script(js)
    

    希望它能帮助你

    这应该足够了

    WebElement textBox = driver.findElement(By.xpath("//span[text()='5000']"));
    textBox.clear();
    textBox.sendKeys("");
    textBox.sendKeys("15000");
    

    我确实发送了一个空格来激活文本框,因为有时DOM可能不会立即反映,因为该元素是安静嵌套的。

    这应该足够了

    WebElement textBox = driver.findElement(By.xpath("//span[text()='5000']"));
    textBox.clear();
    textBox.sendKeys("");
    textBox.sendKeys("15000");
    
    我确实发送了一个空的空格来激活文本框,因为有时DOM可能不会立即反映,因为这个元素是安静嵌套的。

    谢谢您的回复

    它适用于我以下的方法

    webElement.sendKeysByAction(value)
    
    谢谢你的回复

    它适用于我以下的方法

    webElement.sendKeysByAction(value)
    


    前3种方法不正确,因为sendKeys仅适用于“输入”html元素,如textbox和textarea,而不适用于span和div。在第四种方法中,您需要访问span,然后使用innerhtml。-@Grasshopper但是为什么要求助于
    JavascriptExecutor
    ,而没有对
    Java
    click()
    ?@DebanjanB进行公平的测试呢?如果单击使文本框可见以输入文本,则没有提及。如果是这样,那么它应该是首选方法。@Grasshopper我不认为
    文本框
    不可见或
    隐藏的原因。IMO,正如您提到的,OP只是没有深入到
    标记中。所以我猜
    Java click()
    应该可以用。@Grasshopper,
    sendKeys
    不限于任何类型的HTML元素,而且
    可以通过设置属性来编辑。前3种方法不正确,因为sendKeys只对“输入”HTML元素(如textbox和textarea)起作用,不适用于span和div。在第四种方法中,您需要访问span,然后使用innerhtml。-@Grasshopper但是为什么要求助于
    JavascriptExecutor
    ,而没有对
    Java
    click()
    ?@DebanjanB进行公平的测试呢?如果单击使文本框可见以输入文本,则没有提及。如果是这样,那么它应该是首选方法。@Grasshopper我不认为
    文本框
    不可见或
    隐藏的原因。IMO,正如您提到的,OP只是没有深入到
    标记中。所以我猜
    Java click()
    应该可以用。@Grasshopper,
    sendKeys
    不限于任何类型的HTML元素,
    可以通过设置属性进行编辑。在span中传递的文本是不可预测的。它是一个动态值。在传递sendKeys之前,我需要获取文本。请查看我更新的答案,并让我知道状态无法清除webelement,它显示错误为“Element必须是用户可编辑的才能清除”,因此这意味着您自己提供的示例[DIV]不可编辑且不正确&我们无法在这方面帮助您。因此,请通过单击我的
    答案
    旁边的勾号
    接受
    答案
    ,就在
    VoteDown
    箭头下方,这样勾号变为绿色。Div是正确的。使用上面提到的XPath对我不起作用。我需要先得到元素。然后,只有我才能编辑该值。在跨度中传递的文本是不可预测的。它是一个动态值。在传递sendKeys之前,我需要获取文本。请查看我的更新答案,并告诉我无法清除webelement的状态,它将错误显示为“Element必须是用户可编辑的才能清除”,这意味着您自己提供的示例[DIV]未被删除