Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Как взять координаты элемента у IE drivera относительно экрана(имеется ввиду разрешение)?


(Денис Медведев) #1

IWebElement element
Point locationOnScreen = element.Location;
int screenX = locationOnScreen.X;
int screenY = locationOnScreen.Y;

Такой код дает мне координаты относительно страницы, а нужно получить координаты относительно экрана.
Используется С#


(Дмитрий Жарий) #2

UPD: смотрите ответ @vmaximv внизу
Это возможно только через выполнение JavaScript через IJavaScriptExecutor

вот пример на JavaScript получения координат окна браузера на десктопе.

Откройте консоль JS на этой странице. Следующий код выведет позицию логотипа AT.Info относительно экрана.

var atinfoLogo = document.getElementById('site-logo');


function getElementCoords(element)
{
    var browserX = window.screenX;
    var browserY = window.screenY;

    
    var rect = element.getBoundingClientRect();
    var elementOffsetX = rect.left;
    var elementOffsetY = rect.top;

    return {
                X : browserX + elementOffsetX,
                Y : browserY + elementOffsetY,
 	     };
}

// ==

getElementCoords(atinfoLogo);


(vmaximv) #3

А через http://selenium.googlecode.com/git/docs/api/dotnet/html/P_OpenQA_Selenium_ILocatable_LocationOnScreenOnceScrolledIntoView.htm не получится?


(Денис Медведев) #4

Спасибо за советы!!!
Только дошли руки до этой темы, могу отписаться что селениум не помог, остается пробовать выше предложенный метод dzhariy"А"
> IMouse mouse = ((IHasInputDevices)driver).Mouse;

        var signinloc = (ILocatable)element;
        Size dimesions = element.Size;
        var screenX = signinloc.LocationOnScreenOnceScrolledIntoView.X;
        var screenY = signinloc.LocationOnScreenOnceScrolledIntoView.Y;
        mouse.MouseMove(signinloc.Coordinates);

#5

Не уверен, что это именно то, что нужно, но вот люди на Python примерно такой же вопрос решили


(Денис Медведев) #6

Свойство локатион дает координаты элемента относительно браузера, а это не то что нужно. Нужно получить координаты относительно, экрана. Имеется ввиду разрешение.


(Денис Медведев) #7

Вот такой вот код выдает ошибку - “The method or operation is not implemented” а студия пишет System.NotImplementedException

ILocatable signinloc = (ILocatable)element;
Point location = signinloc.Coordinates.LocationOnScreen;

Пошел на http://visualstudiogallery.msdn.microsoft.com/11cfc881-f8c9-4f96-b303-a2780156628d
Сделал все как там сказано, эффекта ноль. Что может быть? Подскажите пожалуйста


(Дмитрий Жарий) #8

Гы :smile:
В исходника вот что

        #region ICoordinates Members
        /// <summary>
        /// Gets the location of an element in absolute screen coordinates.
        /// </summary>
        public System.Drawing.Point LocationOnScreen
        {
            get { throw new NotImplementedException(); }
        }

webdriver/Remote/RemoteCoordinates.cs

Что говорит о том, что эта штука там “для красоты”. И в данный момент не работает.


(Александр Таранков) #9

А можно поинтересоваться для чего тебе координаты элемента относительно экрана? Может твою задачу можно решить по-другому?


(Денис Медведев) #10

Идея была вот какая:
Делим на пополам высоту и ширину элемента, потом добавляем эти координаты к координатам верхней левой точки элемента и кликаем в центр элемента с помощью вот такого кода:

[DllImport(“user32.dll”, CharSet = CharSet.Auto, CallingConvention = CallingConvention.StdCall)]
private static extern void mouse_event(uint dwFlags, uint dx, uint dy, uint cButtons, uint dwExtraInfo);

private static void DoMouseClick()
{
mouse_event(leftDown | leftUp, 0, 0, 0, 0);
}

У меня стоит задача разработать стабильный клик, так как многие способы кликать по элементу часто не срабатывают, к примеру селениум, java клик, сенд энтер и подобные. На данный момент уже есть около 10 кликов, что снижает производительность т.к. мы пытаемся кликать по эл. одним потом другим потом третьим и т.д.
А такой клик по моему личному мнению будет стабильным.
Кстати метод получения координат с помощью явы прделоженный, уважаемым человеком dzhariy также не работает, вернее выдает не точные координаты.

Уверен что упорство победит и я найду способ получения этих координат. Всем спасибо за помощь.


(Александр Таранков) #11

А может просто стоит разобраться почему IEDriver не кликает на элемент? Например, не находит его на странице, потому что он ещё не загрузился. В этой ситуации твои ухищрения не дадут результата


(Александр Таранков) #12

Какую ошибку выдает Webdriver, когда не кликает на элемент?


(vmaximv) #13

Я бы не советовал пытаться решить эту проблему самостоятельно через WinAPI, т.к. IEDriverServer с нативными эвентами делает тоже самое.
Более эффективным будет решение самой проблемы “некликанья”, чем создание многочисленных воркэраундов.
requireWindowFocus=true + enablePersistentHover=true пробовали?


(Денис Медведев) #14

Честно говоря перепробовали очень много, но “ИндоСтайл” мягко говоря удивляет, и я иду таким путем т.к. уверен что именно такой подход раз и на всегда решит проблему клика.

vmaximvУ отвечу - ДА. Пробовали, изменение этих свойств приведет к тому что тесты начнут падать на FF.


(Александр Таранков) #15

Ты идешь неправильным путем. Но дело твое

Ну то есть выставление этих свойств проблему решает? Для IE.


(Денис Медведев) #16

Не всегда, есть такие линки по которым не кликает вообще ничто!!! Обходимся в этом случае благодаря Sikuli или OpenCV.


(Денис Медведев) #17

Ответ избавил от мучительного вопроса, Большое спасибо!!!


(vmaximv) #18

Эмм… Т.е. вы параллельно ранаете тесты на ФФ и ИЕ с нативными эвентами на одной и той же машине?
Прочитайте секцию “Native Events and Internet Explorer” на https://code.google.com/p/selenium/wiki/InternetExplorerDriver - каким образом вы будете решать озвученные там проблемы, ведь вполне очевидно что просто mouse_event из user32.dll не достаточно?

Можете пробежать по исходникам, что бы в полной мере осознать серьезность проблемы:


А можете назвать Джима нубом, ничего не смыслящим в WinApi, IE, С++ и продолжать изобретать велосипед :slight_smile:


(Денис Медведев) #19

Макс от скажи че ты такой умный? © Гепа.


(Александр Таранков) #20

Отпишись пожалуйста по результатам в этой теме. Как удалось победить проблему.