Можно ли программно определить, используются ли команды действий W3C?

Selenium Javadoc для Actions.moveToElement указывают на то, что значения xOffset а также yOffset Аргументы таковы.

xOffset - Offset from the top-left corner. A negative value means coordinates left from the element.
yOffset - Offset from the top-left corner. A negative value means coordinates above the element.

Рассмотрим следующую программу, работающую на Linux против Firefox Quantum.

public class FirefoxTest {
    public static void main(String[] args) {
        // Set up driver
        WebDriver driver = new FirefoxDriver();
        JavascriptExecutor js = (JavascriptExecutor) driver;

        driver.get("http://www.google.com");
        WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.name("q")));

        // Perform a move and click action to see where it lands.
        Actions moveAndClick = new Actions(driver).moveToElement(element,0,0).doubleClick();
        moveAndClick.perform();
    }
}

Когда запускается следующая программа, двойной щелчок происходит в середине поля поиска, а не в верхнем левом углу (я знаю это, потому что я ввел JS для регистрации местоположения щелчка). Кроме того, следующее сообщение выводится в терминал, где запускается программа.

org.openqa.selenium.interactions.Actions moveToElement
INFO: When using the W3C Action commands, offsets are from the center of element

Можно ли программно определить, являются ли смещения от центра или верхнего левого угла элемента для Actions.moveToElement ?

1 ответ

Начнем с того, что при вызове GeckoDriver первый набор журналов подтверждает, что диалект W3C следующее:

org.openqa.selenium.remote.ProtocolHandshake createSession
INFO: Detected dialect: W3C

Вы правы как Документы Java для moveToElement() все еще упоминает, что:

public Actions moveToElement(WebElement target, int xOffset, int yOffset)

Description:
Moves the mouse to an offset from the top-left corner of the element. The element is scrolled into view and its location is calculated using getBoundingClientRect.

Parameters:
    target - element to move to.
    xOffset - Offset from the top-left corner. A negative value means coordinates left from the element.
    yOffset - Offset from the top-left corner. A negative value means coordinates above the element.

Returns:
A self reference.

Я могу воспроизвести вашу проблему следующим образом:

  • Блок кода:

    new Actions(driver).moveToElement(element,0,0).doubleClick().build().perform();
    
  • Журналы трассировки:

    Oct 16, 2018 6:06:13 PM org.openqa.selenium.interactions.Actions moveToElement
    INFO: When using the W3C Action commands, offsets are from the center of element
    1539693373141   webdriver::server   DEBUG   -> POST /session/180ab0f0-21a3-4e38-8c92-d208fac77827/actions {"actions":[{"id":"default mouse","type":"pointer","parameters":{"pointerType":"mouse"},"actions":[{"duration":100,"x":0,"y":0,"type":"pointerMove","origin":{"ELEMENT":"774efad2-7ee0-40a3-bcaa-3a4d5fcff47b","element-6066-11e4-a52e-4f735466cecf":"774efad2-7ee0-40a3-bcaa-3a4d5fcff47b"}},{"button":0,"type":"pointerDown"},{"button":0,"type":"pointerUp"},{"button":0,"type":"pointerDown"},{"button":0,"type":"pointerUp"}]}]}
    1539693373166   Marionette  TRACE   0 -> [0,5,"WebDriver:PerformActions",{"actions":[{"actions":[{"duration":100,"origin":{"element-6066-11e4-a52e-4f735466cecf":"774e ... pointerDown"},{"button":0,"type":"pointerUp"}],"id":"default mouse","parameters":{"pointerType":"mouse"},"type":"pointer"}]}]
    

Как отметил @Andreas в обсуждении, смещения идут от центра элемента, а не от верхнего левого угла @FlorentB. четко указал, что:

  • В соответствии с /session/:sessionId/moveto в спецификации JsonWireProtocol было упомянуто:

    /session/:sessionId/moveto
        POST /session/:sessionId/moveto
        Move the mouse by an offset of the specificed element. If no element is specified, the move is relative to the current mouse cursor. If an element is provided but no offset, the mouse will be moved to the center of the element. If the element is not visible, it will be scrolled into view.
    
        URL Parameters:
        :sessionId - ID of the session to route the command to.
    
        JSON Parameters:
        element - {string} Opaque ID assigned to the element to move to, as described in the WebElement JSON Object. If not specified or is null, the offset is relative to current position of the mouse.
        xoffset - {number} X offset to move to, relative to the top-left corner of the element. If not specified, the mouse will move to the middle of the element.
        yoffset - {number} Y offset to move to, relative to the top-left corner of the element. If not specified, the mouse will move to the middle of the element.
    
  • В соответствии с разделом Действия с указателями в черновике редактора WebDriver W3C указано, что:

    Объект, который представляет веб-элемент

    1. Пусть элемент будет равен результату попытки получить известный связанный элемент с аргументом origin.

    2. Пусть элемент x и элемент y будут результатом вычисления центральной точки элемента в поле зрения.

    3. Пусть x равен x элементу + x offset, а y равен y элементу + y offset.

Центральная точка обзора

Центральная точка в представлении элемента является исходной позицией прямоугольника, который является пересечением между первым клиентским прямоугольником DOM элемента и начальным окном просмотра. Учитывая элемент, который, как известно, находится в поле зрения, он рассчитывается как:

  • Пусть rectangle будет первым элементом последовательности DOMRect, возвращаемой вызовом getClientRects для элемента.
  • Пусть left будет (max(0, min(координата x, координата x + размерность по ширине))).
  • Пусть right будет (min(innerWidth, max(координата x, координата x + измерение ширины))).
  • Пусть top будет (max(0, min(координата y, координата y + размерность))).
  • Пусть bottom будет (min(innerHeight, max(координата y, координата y + размерность по высоте))).
  • Пусть x будет (0,5 × (влево + вправо)).
  • Пусть у (0,5 × (верх + низ)).
  • Вернуть x и y как пару.

Таким образом, можно сделать вывод, что смещения от центра, но Документы Хейва еще не обновлены.

Если предлагается щелкнуть в верхнем левом углу элемента, то следующий фрагмент кода будет делать

WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.visibilityOfElementLocated(By.name("q")));
        Actions moveAndClick = new 
int yOffset=element.getRect().height/-2;//top
int xOffset=element.getRect().width/-2;//left
Actions(driver).moveToElement(element,xOffset,yOffset).doubleClick().perform();
Другие вопросы по тегам