Selenium Java - moveToElement不能在headless中工作,但在chrome中工作



我有一个画布元素,我试图鼠标悬停在画布元素与下面的代码。它在Chrome中工作得很好。然而,在无头浏览器中,在moveToElement步骤没有错误,但鼠标悬停没有在我想要的偏移量执行。我甚至设置了偏移工作的窗口大小,仍然没有像预期的那样工作


Dimension bd = new Dimension(1296, 696);
driver.manage().window().setSize(bd);
canvasElementDimensions = driver.manage().window().getSize().toString();
WebElement canvas = driver.findElement(By.xpath(canvasElementXpath));

Dimension canvasDimension = canvas.getSize();    
int canvas_center_x = canvasDimension.getWidth()/2;
int canvas_center_y = canvasDimension.getHeight()/2;

int mouse_hover_x = (canvas_center_x/-9)*2;
canvasElementXOffset = String.valueOf(mouse_hover_x);
int mouse_hover_y = (canvas_center_y/-9)*2;
canvasElementYOffset = String.valueOf(mouse_hover_y);

Actions action = new Actions(driver);
action.moveToElement(canvas, mouse_hover_x, mouse_hover_y)
.perform();

我不确定您到底想要移动到哪里—是移动到画布元素上方的特定位置还是只是移动到元素的中间。如果画布上方的位置对你来说不重要,我将删除所有的偏移计算,只使用如下:

Actions action = new Actions(driver);
action.moveToElement(canvas).perform();

因为基于JavaDoc,这将把指针移动到元素的中间:

moveToElement (WebElement toElement)

将鼠标移动到元素中间。

为了在无头模式下工作,你必须在ChromeOptions中设置几个设置。
在初始化浏览器驱动程序之前尝试这个设置:

ChromeOptions opts = new ChromeOptions();
opts.setExperimentalOption("prefs", prefs);
opts.addArguments("--headless", "--disable-gpu", "--window-size=1920,1080","--ignore-certificate-errors","--no-sandbox", "--disable-dev-shm-usage");
driver = new ChromeDriver(opts);

在headless模式下你并没有真正的UI元素。所有元素都是虚的,所以它们没有实际的位置和大小。

尝试查找元素:

  • ID
  • CSS
  • Xpath

找到元素后:

webElement.click();

或:

new Actions(browser).moveToElement(element, 0, 0).click().build().perform();

如果需要悬停然后点击,悬停代码:

Actions builder = new Actions(browser);
builder.moveToElement(lastFoundElement).build().perform();

通过Xpath或CSS找到工具提示中的下一个元素,然后单击它。

相关内容

最新更新