Скорость и нагрузка разных локаторов (какой лучше использовать)


(Alex Shats) #1

WebDriver предоставляет возможность использовать разные типы локаторов.
Хотелось бы узнать какой из них лучше всего использовать что бы нагрузка была ниже и быстрее работало.
Стоит ли повсеместно использовать XPath?

Вот к примеру найти обьект по class или id. Кто сработает быстрее? Xpath? CssSelector?


(vmaximv) #2

Без разницы. Но если для вас критичны пару десятков миллисекунд - ставьте xpath на последнее место.


(Алексей Михайлович) #3

Если не ошибаюсь, то по скорости обработки локаторы расположены следующим образом:
id - самый быстрый;
name;
cssSelector;
xpath - самый медленный.
Однако стоит учесть, что разница в скорости обработки локаторов составляет несколько миллисекунд(пару десятков, как подсказывает комментарий @vmaximv ), а с учетом того что зачастую какие-либо элементы на странице могут грузиться пару секунд, то разница не особо ощутима.


(Mykhailo Poliarush) #4

Просто кину ссылку на уже обсуждавшийся вопрос


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

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

Тут больше важна оптимальность локаторов. И оптимальность использования веб элементов.

Нужно всегда учитывать тот факт, что любое обращение к (почти) любому WebElement – это отдельный HTTP запрос.

В, на первый, безобидном примере ниже, я перебираю все ссылки на странице и вывожу дополнительные свойства для тех, в которых есть href=”AlexS”.

По причине не оптимальности алгоритма, было сделано 172 HTTP запроса, из них 4 для того, чтобы получить 4 свойства уже найденного элемента.

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Net;
using System.Drawing;

using OpenQA.Selenium;
using OpenQA.Selenium.Remote;
using OpenQA.Selenium.Firefox;


namespace ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            // Set fiddler as global proxy for current app
            WebProxy myProxy = new WebProxy(@"http://127.0.0.1:8888");
            HttpWebRequest.DefaultWebProxy = myProxy;


            // Create new local "remote" driver to capture the traffic
            var caps = DesiredCapabilities.Firefox();
            var remoteUrl = new Uri(@"http://ipv4.fiddler:4444/wd/hub");
            var driver = new RemoteWebDriver(remoteUrl, caps);

            // Just set a convinient size for demo
            driver.Manage().Window.Size = new Size()
            {
                Width = 768,
                Height = 700,
            };

            driver.Url = "http://automated-testing.info/t/skorost-i-nagruzka-raznyh-lokatorov-kakoj-luchshe-ispolzovat/4622/4";

            // Get all links on the page
            var links = driver.FindElementsByTagName("a");

            // find the link that contains "AlexS"

            foreach (var link in links)
            {
                string linkHref = link.GetAttribute("href") ?? "";
                if (linkHref.Contains("AlexS"))
                {
                    Console.WriteLine("Enabled?: " + link.Enabled);
                    Console.WriteLine("Displayed?: " + link.Displayed);
                    Console.WriteLine("link.Location.X: " + link.Location.X);
                    Console.WriteLine("link.Location.Y: " + link.Location.Y);
                }
            }
        }
    }
}