t.me/atinfo_chat Telegram группа по автоматизации тестирования

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

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

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

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

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

1 Симпатия

Спасибо за советы!!!
Только дошли руки до этой темы, могу отписаться что селениум не помог, остается пробовать выше предложенный метод 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);

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

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

Вот такой вот код выдает ошибку - “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
Сделал все как там сказано, эффекта ноль. Что может быть? Подскажите пожалуйста

Гы :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

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

1 Симпатия

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

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

[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 также не работает, вернее выдает не точные координаты.

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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