Как получить точную Y-координату из getLocation в Селене Java? - PullRequest
0 голосов
/ 24 октября 2019

Предварительные требования:

Selenium 3.141

Браузер Firefox

Требование : Получить координаты x, ywebelement и выполнить перемещение мыши по координатам xy. X рассчитывается правильно, тогда как y координата имеет длину в 100 пикселей.

Примечание : поле формы Webelement скрыто, пользователь выполнит вертикальную прокрутку и щелкнет по нему. Координаты берутся после прокрутки.

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)

Другие испытания: Пробовал при открытом браузере в полноэкранном режиме, но та же проблема.

Запросы:

Как получить точноеу координата?

Рассчитывается ли координата 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 ко-ордеров как 700, но элемент может иметь 900 пикселей.

Когда я делаю мышиный ход, он возвращается на 700 пикселей, что не является элементом, который нужно перетаскивать. Мой webelement (источник) по-прежнему на 900 пикселей. С координатой X все в порядке.

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();

Снова у не хватает. В чем будет причина?

Результат 2: Вышеуказанный фрагмент кода (movetoelement) работает для chrome, но не для firefox.

1 Ответ

0 голосов
/ 24 октября 2019

getLocation ()

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


В качестве примера для извлечения координат X и Y для окно поиска на Домашняя страница Google Вы можете использовать следующее решение:

  • Блок кода:

    driver.get("https://www.google.com/");
    WebElement element = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.name("q")));
    Point elementLocation = element.getLocation();
    System.out.println("X coordinate of the element is: "+elementLocation.getX());
    System.out.println("Y coordinate of the element : "+elementLocation.getY());
    //or
    WebElement elem = new WebDriverWait(driver, 10).until(ExpectedConditions.elementToBeClickable(By.name("q")));
    System.out.println("X coordinate is: "+elem.getLocation().getX());
    System.out.println("Y coordinate is: "+elem.getLocation().getY());
    driver.quit();
    
  • Вывод на консоль:

    X coordinate of the element is: 439
    Y coordinate of the element : 322
    X coordinate is: 439
    Y coordinate is: 322
    

Обновление 1

Из вашего вопроса не очень понятно, почему вы хотите выполнить перемещение мыши на xy координаты. Однако для достижения оптимальных результатов вам необходимо:


Заключение

Как вы упомянули ... выполните вертикальную прокрутку и нажмите на нее ... scrollIntoView() выглядит как чисто накладные расходы как:

следующие методы:

автоматически прокручивает элемент в Окно просмотра .


Обновление 2

Согласно вашему комментарию, чтобы устранить ошибку, касающуюся ... за пределами области просмотра ... , вы можете обратиться к обсуждению org.openqa.selenium.interactions.MoveTargetOutOfBoundsException: (x,y) выходит за границы, в то время как MouseHover с GeckoDriver Firefox Selenium


Обновление 3

Согласно вашему комментарию ... он возвращается на 700 пикселей, как возвращено,который не является элементом для перетаскивания ... стоит упомянуть, что, как я уже упоминал в своем ответе, getLocation() возвращает точку, где на странице находится верхний левый-ручный угол визуализируемого элемента. Что касается выполнения успешной операции Drag and Drop , предположительно перетаскиваемый элемент необходимо перетаскивать до определенного процента в пределах элемента сбрасывания.

Кроме того, если перетаскиваемый элемент html5 имеетатрибут draggable его необходимо обрабатывать по-разному, что является совершенно другой темой, и мы можем обсудить его в отдельной теме.

Соответствующий HTML-код помог бы нам в огромной степени.


Ссылки

Вы можете найти несколько подробных обсуждений в:

...