问题
This question is similar to the one asked here. However in that case it seems that the poster's ultimate purpose was actually to select a paragraph of text, and they were able to find a work-around which did not involve clicking.
Like the user in the above question I initially thought that it would be possible to simulate a triple-click by calling the click method three times.
new Actions(driver)
.moveToElement(svgElement, posX, posY)
.click()
.click()
.click()
.perform()
However, this doesn't work as the my javascript code checks the the detail
attribute of the UIEvent
instance, and this is always 1
for each call to click
. Thus the following snippet:
function clickHandler (event) {
if (event.detail == 1) {
singleClickHandler()
}
if (event.detail == 2) {
doubleClickHandler()
}
if (event.detail == 3) {
tripleClickHandler()
}
causes singleClickHandler
to be called three times when called via Selenium, whereas each of singleClickHandler
, doubleClickHandler
, and tripleClickHandler
is called once when this is exercised manually via the browser (Firefox).
How do I cause a click event with detail
equal to 3 to be triggered via selenium?
回答1:
The current api doesn't provide a way to simulate a triple click which would emit a single click event with the count of clicks. So your best chance is likely to simulate the event with executeScript:
String JS_CLICK_TRIPLE =
"var target = arguments[0]; " +
"var offsetX = arguments[1]; " +
"var offsetY = arguments[2]; " +
"var rect = target.getBoundingClientRect(); " +
"var cx = rect.left + (offsetX || (rect.width / 2)); " +
"var cy = rect.top + (offsetY || (rect.height / 2)); " +
" " +
"emit('mousedown', {clientX: cx, clientY: cy, buttons: 1}); " +
"emit('mouseup', {clientX: cx, clientY: cy}); " +
"emit('mousedown', {clientX: cx, clientY: cy, buttons: 1}); " +
"emit('mouseup', {clientX: cx, clientY: cy}); " +
"emit('mousedown', {clientX: cx, clientY: cy, buttons: 1}); " +
"emit('mouseup', {clientX: cx, clientY: cy}); " +
"emit('click', {clientX: cx, clientY: cy, detail: 3}); " +
" " +
"function emit(name, init) { " +
"target.dispatchEvent(new MouseEvent(name, init)); " +
"} " ;
Actions action1 = new Actions(driver);
action1.moveToElement(yourElement, posX, posY).perform();
((JavascriptExecutor)driver).executeScript(
JS_CLICK_TRIPLE, yourElement, posX, posY);
回答2:
Maybe you could try something like below:
WebElement yourElement = driver.findElement(By.xpath("xpath locator here"));
Actions action = new Actions(driver);
Actions action1= new Actions(driver);
action1= action.moveToElement(yourElement).doubleClick();
action1.click().build().perform();
来源:https://stackoverflow.com/questions/44330194/triple-click-using-selenium