前置要求:
硒 3.141
火狐浏览器
要求:获取网页元素的 x,y 坐标并执行鼠标移动到 xy 坐标。X 计算正确,而y 坐标下降了 100 像素。
注意:Webelement Formfield 是隐藏的,用户将执行垂直滚动并单击它。滚动后获取坐标。
WebElement fromfield = driver.findElement(By.xpath("//*[contains(@data-field-name,'deliverables')]"));
jse.executeScript("arguments[0].scrollIntoView();",fromfield); //scroll to the webelement, a small wait is given after scrolling
org.openqa.selenium.Point fromLocation = fromfield.getLocation();
int fromfield_x = fromLocation.x;
int fromfield_y = fromLocation.y; //getx/gety returns same values
Actual Output: x = 550, y = 600
Expected Output: x = 550, y = 700. (**Note**: If I pass 700, then mouse moves correctly to required element, but here y is calculated incorrect)
其他试验:尝试以全屏模式打开浏览器,但同样的问题。
查询:
如何获得精确的y坐标?
xy 坐标是从桌面窗口或视口的左上角计算的吗?
更新
地位:
根据您的建议,我尝试了下面的代码行,是的,它会自动滚动到所需的元素。
WebElement source = fromfield.findElement(By.xpath(".//*[contains(@title,'test')]"));
new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(source))).build().perform();
结果1:
System.out.println("Y coordinate is: "+source.getLocation().getY());
int from_x = source.getLocation().getX();
int from_y = source.getLocation().getY();
我得到 y co-ords 为 700,但元素可能为 900 像素。
当我做 mousemove 时,它会移动到返回的 700 像素,这不是要拖动的元素。我的 webelement (source) 仍然是 900 像素。X坐标完全OK。
robot.mouseMove(from_x , from_y); //moves to 700 pixels
Actions maction=new Actions(driver);
Action drag = maction.clickAndHold(source).pause(3000).build();
drag.perform(); //tries to drag from 700 pixels
或者
new Actions(driver).moveToElement(new WebDriverWait(driver, 20).until(ExpectedConditions.elementToBeClickable(source))).clickAndHold(source).build().perform();
y 再次不足。原因是什么?
结果2: 上面的代码片段(movetoelement)适用于chrome,但不适用于firefox。