WebDriver предоставляет возможность использовать разные типы локаторов.
Хотелось бы узнать какой из них лучше всего использовать что бы нагрузка была ниже и быстрее работало.
Стоит ли повсеместно использовать XPath?
Вот к примеру найти обьект по class или id. Кто сработает быстрее? Xpath? CssSelector?
Если не ошибаюсь, то по скорости обработки локаторы расположены следующим образом:
id - самый быстрый;
name;
cssSelector;
xpath - самый медленный.
Однако стоит учесть, что разница в скорости обработки локаторов составляет несколько миллисекунд(пару десятков, как подсказывает комментарий @vmaximv ), а с учетом того что зачастую какие-либо элементы на странице могут грузиться пару секунд, то разница не особо ощутима.
В данный, скорость поиска элементов в зависимости от локатора не особо важна. Все они находят элемент достаточно быстро.
Конечно же, в любом случае, 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);
}
}
}
}
}