Javascript Selenium via Java-单击复选框与手动单击不同的响应

Javascript Selenium via Java-单击复选框与手动单击不同的响应,javascript,jquery,html,selenium,checkbox,Javascript,Jquery,Html,Selenium,Checkbox,我有一个问题,点击一个特定的复选框,它应该选中它下面的所有其他复选框(根参数)。 当我在元素上使用此代码时,它曾经起作用: arguments[0].click(); 我曾尝试使用普通的单击方法,但它不起作用,我还尝试使用: ("document.getElementById('" + checkBoxID + "').checked=true"); ("document.getElementById('" + checkBoxID + "').onchange();") 我发现,当我触发c

我有一个问题,点击一个特定的复选框,它应该选中它下面的所有其他复选框(根参数)。 当我在元素上使用此代码时,它曾经起作用:

arguments[0].click();
我曾尝试使用普通的
单击
方法,但它不起作用,我还尝试使用:

("document.getElementById('" + checkBoxID + "').checked=true");
("document.getElementById('" + checkBoxID + "').onchange();")
我发现,当我触发click by
JS
时,响应与手动单击复选框时不同。 值得一提的是,手动单击复选框确实会正确触发事件,并且主复选框下方的其他复选框也会被选中。 是否有其他可能的方式触发
onchange
事件?我试图用以下命令强制
onchange

document.getElementById("test").onchange()
提前谢谢

function simulateClick() { 
var event = new MouseEvent('click',     { 'view': window, 'bubbles': true, 'cancelable': true }); //creates a mouse event
var cb =  document.getElementById('checkbox');     var canceled = !cb.dispatchEvent(event); //fires the event.
}

示例来自。要使用selenium运行javascript代码,请参见下一个答案…

正如您所说的selenium
click()
无法按预期工作,您应该尝试使用
JavascriptExecutor
触发
MouseeEvents
,如下所示:-

WebElement el = driver.findElement(By.id("checkboxId"));
JavascriptExecutor executor = (JavascriptExecutor)driver
executor.executeScript("function triggerMouseEvent (node, eventType) {"
                        + "var clickEvent = document.createEvent ('MouseEvents');"
                        + "clickEvent.initEvent (eventType, true, true);"
                        + "node.dispatchEvent (clickEvent);"
                        + "}triggerMouseEvent (arguments[0], 'mouseover');"
            + "triggerMouseEvent (arguments[0], 'mousedown');"
            + "triggerMouseEvent (arguments[0], 'mouseup');"
            + "triggerMouseEvent (arguments[0], 'click');", el);
el = (WebElement)executor.executeScript("arguments[0].style.display = 'block';return arguments[0];", el);
el.click();
JavascriptExecutor executor = (JavascriptExecutor)driver
WebElement el = (WebElement)executor.executeScript("return document.getElementById('flattendListproductLinesTree|1@innerVO@isSelected')");
WebDriverWait wait = new WebDriverWait(driver, 10);
el = wait.until(ExpectedConditions.visibilityOf(el)));
el.click();
Edited1:-如果要使用
executeScript
使复选框可见,并要使用
selenium
单击()
执行,请尝试以下操作:-

WebElement el = driver.findElement(By.id("checkboxId"));
JavascriptExecutor executor = (JavascriptExecutor)driver
executor.executeScript("function triggerMouseEvent (node, eventType) {"
                        + "var clickEvent = document.createEvent ('MouseEvents');"
                        + "clickEvent.initEvent (eventType, true, true);"
                        + "node.dispatchEvent (clickEvent);"
                        + "}triggerMouseEvent (arguments[0], 'mouseover');"
            + "triggerMouseEvent (arguments[0], 'mousedown');"
            + "triggerMouseEvent (arguments[0], 'mouseup');"
            + "triggerMouseEvent (arguments[0], 'click');", el);
el = (WebElement)executor.executeScript("arguments[0].style.display = 'block';return arguments[0];", el);
el.click();
JavascriptExecutor executor = (JavascriptExecutor)driver
WebElement el = (WebElement)executor.executeScript("return document.getElementById('flattendListproductLinesTree|1@innerVO@isSelected')");
WebDriverWait wait = new WebDriverWait(driver, 10);
el = wait.until(ExpectedConditions.visibilityOf(el)));
el.click();
Edited2:-我认为您没有指向正确的复选框进行单击,因为我看到您提供的HTML复选框id可能是动态生成的,您应该实现
WebDriverWait
ti等待复选框可见,如下所示:-

WebElement el = driver.findElement(By.id("checkboxId"));
JavascriptExecutor executor = (JavascriptExecutor)driver
executor.executeScript("function triggerMouseEvent (node, eventType) {"
                        + "var clickEvent = document.createEvent ('MouseEvents');"
                        + "clickEvent.initEvent (eventType, true, true);"
                        + "node.dispatchEvent (clickEvent);"
                        + "}triggerMouseEvent (arguments[0], 'mouseover');"
            + "triggerMouseEvent (arguments[0], 'mousedown');"
            + "triggerMouseEvent (arguments[0], 'mouseup');"
            + "triggerMouseEvent (arguments[0], 'click');", el);
el = (WebElement)executor.executeScript("arguments[0].style.display = 'block';return arguments[0];", el);
el.click();
JavascriptExecutor executor = (JavascriptExecutor)driver
WebElement el = (WebElement)executor.executeScript("return document.getElementById('flattendListproductLinesTree|1@innerVO@isSelected')");
WebDriverWait wait = new WebDriverWait(driver, 10);
el = wait.until(ExpectedConditions.visibilityOf(el)));
el.click();

希望对您有所帮助……:)

onchange是一个事件处理程序。您不能这样调用它来调用系统事件。那么我如何解决这个问题?当您通过selenium方法单击时发生了什么事
click()
??嘿@SaurabhGaur,当我尝试单击它时,我得到异常“元素当前不可见,因此可能无法与命令持续时间或超时进行交互:15.09秒”,我试着检查,但元素没有显示出来,这就是它发生的原因,JS有没有办法让元素按显示计数,这样我就可以正常点击它?@ZvikaNadav哦,我明白了。。意味着您希望首先使其可见。。对吗?这基本上是一个代码唯一的答案,所以不赞成。请花一分钟来描述代码的作用以及它如何回答问题,以便OP和未来的读者能够更好地理解。嘿,谢谢你的回答,但正如@JeffC所说,这是唯一的代码回答,我希望更好地理解它以及它的作用。提前谢谢你能解释我如何为我的代码实现它吗?我试图将复选框更改为相关ID,谢谢。嘿,我仍在等待你的答复,很遗憾,我仍然面临与复选框相同的问题谢谢你的回答,我已尝试使复选框可见,但它不起作用,在运行
el=(WebElement)executor.executeScript(“参数[0].style.display='block';返回参数[0];”,el)后元素仍不显示;el.click()@ZvikaNadav您是否尝试了触发事件的第一个选项???@ZvikaNadav我提供了使元素可见的唯一通用方法。您需要共享您的复选框HTML。。我想看看哪个样式是不可见的,这就是为什么我可以让它可见的原因这里有一个复选框html:
@ZvikaNadav,因为我看到没有样式集可以让它不可见??它似乎在你的网站上看不见吗??