如何在selenium中使用JavascriptExecutor右键单击svg元素

如何在selenium中使用JavascriptExecutor右键单击svg元素,javascript,html,selenium,svg,selenium-webdriver,Javascript,Html,Selenium,Svg,Selenium Webdriver,我必须右键点击我网页的特定部分 在我需要右键单击的部分,背景层中有一些svg元素。这些svg元素位于不可见的不同层中。下面是html代码 可见部分(图像中突出显示的div元素,其类值包含“z-Timeline-timelinerack”)的HTML代码如下所示(您也可以在下面的代码中看到svg元素部分) 正如您所见,有许多“线”元素。。我需要在指定行上执行右键单击 我能够使用下面的xpath定位特定的行元素 @FindBy(xpath ="//*[name()='svg']//*[name(

我必须右键点击我网页的特定部分

在我需要右键单击的部分,背景层中有一些svg元素。这些svg元素位于不可见的不同层中。下面是html代码

可见部分(图像中突出显示的div元素,其类值包含“z-Timeline-timelinerack”)的HTML代码如下所示(您也可以在下面的代码中看到svg元素部分)

正如您所见,有许多“线”元素。。我需要在指定行上执行右键单击

我能够使用下面的xpath定位特定的行元素

@FindBy(xpath ="//*[name()='svg']//*[name()='line'][5]")
public WebElement anyAgendaLine;
在互联网上搜索之后,我发现我可以使用JavascriptExecutor点击任何不可见的元素。在找到这个之前,我尝试使用动作执行上下文菜单单击,这给出了下面的错误

原因: org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: 元素内的偏移量无法滚动到视图中:(2.5,0.5): [对象SVGLineElement]

我的关联菜单单击代码如下所示:

public static void rightClickAndSelectMenuItem(WebElement objWebElement, WebElement menuItem){
        Actions action=new Actions(Setup.driver);
        action.contextClick(objWebElement).sendKeys(Keys.ARROW_DOWN).click(menuItem).build().perform();

}
在发现上下文菜单单击不起作用后,我尝试只单击“line”元素:

(JavascriptExecutor js = (JavascriptExecutor)driver; 
js.executeScript("arguments[0].click();", objAgendaPage.anyAgendaLine); 
这给了下面的错误

org.openqa.selenium.WebDriverException:参数[0]。单击不是一个选项 作用

所以请帮帮我。我甚至不能只点击这个不可见的“线”元素。
实际上,我需要执行右键单击。

以便使用JavaScript右键单击(借助于):


要使用JavaScript右键单击(在的帮助下):


不要将屏幕截图用作代码,请将实际代码放入问题中。您可以添加页面相关部分的屏幕截图吗?是否可以使用上下文单击来代替坐标?就像从一个容器中找出位置一样?@Liam我只是觉得这会让问题变得冗长,而且人们可以通过使用图像快速而清晰地了解元素的层次结构。@Grasshopper很抱歉回答得太晚了。。它正在用你提到的方法工作。。我得到了SVG元素(objAgendaPage.anyAgendaLine)的位置,然后使用这些坐标右键单击元素(objAgendaPage.timeLineTrack),该元素可见。。。下面是代码。。actions.moveToElement(objAgendaPage.timeLineTrack,objAgendaPage.anyAgendaLine.getLocation().getX(),objAgendaPage.anyAgendaLine.getLocation().getY()).contextClick().click(objAgendaPage.createAppointmentContextualTable).build().perform()@Grasshopper我无法直接右键单击SVG元素,因为这些元素位于另一个隐藏的层中。。因此,我必须获得SVG元素的位置,然后右键单击可见的元素。。非常感谢您的帮助。不要将屏幕截图用作代码,请将实际代码放入问题中。您可以添加页面相关部分的屏幕截图吗?是否可以使用上下文单击来代替坐标?就像从一个容器中找出位置一样?@Liam我只是觉得这会让问题变得冗长,而且人们可以通过使用图像快速而清晰地了解元素的层次结构。@Grasshopper很抱歉回答得太晚了。。它正在用你提到的方法工作。。我得到了SVG元素(objAgendaPage.anyAgendaLine)的位置,然后使用这些坐标右键单击元素(objAgendaPage.timeLineTrack),该元素可见。。。下面是代码。。actions.moveToElement(objAgendaPage.timeLineTrack,objAgendaPage.anyAgendaLine.getLocation().getX(),objAgendaPage.anyAgendaLine.getLocation().getY()).contextClick().click(objAgendaPage.createAppointmentContextualTable).build().perform()@Grasshopper我无法直接右键单击SVG元素,因为这些元素位于另一个隐藏的层中。。因此,我必须获得SVG元素的位置,然后右键单击可见的元素。。非常感谢你的帮助。。
js.executeScript("function contextMenuClick(element){
var evt = element.ownerDocument.createEvent('MouseEvents');

var RIGHT_CLICK_BUTTON_CODE = 2;

evt.initMouseEvent('contextmenu', true, true,
     element.ownerDocument.defaultView, 1, 0, 0, 0, 0, false, false, false, false, RIGHT_CLICK_BUTTON_CODE, null);

  if (document.createEventObject){
     // dispatch for IE
     return element.fireEvent('onclick', evt)
  }
  else{
     // dispatch for firefox + others
    return !element.dispatchEvent(evt);
  }
}; contextMenuClick();", objAgendaPage.anyAgendaLine);