Selenium Driver для приложений Winforms
Любые взносы приветствуются :)
Этот проект использует
Почему другой драйвер, когда уже есть https://github.com/microsoft/winappdriver? Приложение, которое я тестирую, довольно большое со многими элементами, и этот драйвер был выведен после 60 секунд на некоторых запросах XPath (см. Эта проблема), и после того, как все собрало все, запрос закончился менее 2 секунды.
Этот проект опирается на MS UI Automation, которая является частью API доступности Windows.
В официальной документации упоминается поддержка для различных платформ:
Automation пользовательского интерфейса поддерживается в следующих операционных системах: Windows XP, Windows Server 2003, Windows Server 2003 R2, Windows Vista, Windows 7, Windows 10, Windows Server 2008, Windows Server 2008 R2, Windows Server 2012, Windows Server 2012, Windows Server 2016 и Windows Server 2019.
Я не могу подтвердить, что это будет работать на этих платформах, так как у меня есть только Win 10 Enterprise на моей машине, но все необходимые библиотеки являются частью проекта.
Насколько я знаю, режим разработчика не требуется.
В настоящее время нет установщика. Клонировать репозиторий и построить исполняемый файл из источников. Используйте исполняемый файл, найденный в рамках WinAppDriver.ServerbinDebugWinAppDriver.Server.exe
Последняя версия драйвера клиента 3.141.0.0 должна использоваться при вызове сервера.
Ok , и Yes , дополнительные подписи могут быть добавлены путем установки возможностей acceptAlertButtonCaptions с полуколоном разделенного списка значений Cancel , и No , дополнительные подписи могут быть добавлены путем установки возможностей dismissAlertButtonCaptions с полуколоном разделенного списка значений Неподдерживаемые команды селена
Поддержка XPath:
//node[3] //node[@attribute = 'X'] Реализована только эта команда Appium
Добавьте ссылку на Selenium.WebDriver v3.141.0 (https://www.nuget.org/packages/selenium.webdriver/3.141.0), и вы готовы к работе.
Драйвер может либо запустить систему в процессе тестирования, либо прикрепить к процессу выполнения. Используйте возможности для определения процесса для прикрепления.
Когда аргумент командной строки не будет предоставлен, сервер будет запущен по IP-адресу по умолчанию http://127.0.0.1:4444 .
Поддерживаются следующие возможности:
mode - start (значение по умолчанию) или attachprocessId - ID процесса для прикрепления кprocessName - имя процесса для прикрепления кexePath или app - Путь к исполняемому файлу для запуска процесса (в настоящий момент аргументы не могут быть предоставлены)appWorkingDir - установите рабочий каталог нового процессаmainWindowTitle - регулярное выражение, чтобы помочь Winappdriver сузить процесс, чтобы прикрепить кsendKeyStrategy ( oneByOne | grouped | setValue ) - Стратегия, которую можно использовать для ввода текста в текстовое поле, значение по умолчанию составляет oneByOne , в настоящее время эта возможность не может быть изменена во время сеанса public static RemoteWebDriver CreateSessionByStartingTheApplication()
{
DesiredCapabilities desktopCapabilities = new DesiredCapabilities();
desktopCapabilities.SetCapability("app", "<name of the program to start>");
// or "exePath" desktopCapabilities.SetCapability("exePath", "<path to the executable to start the process>");
// following capabilities should be provided for UWP applications like Calculator or Clocks & Alarms
// optional - to set the working directory
desktopCapabilities.SetCapability("appWorkingDir", "<path to run the process in>");
// optional - to identify the process
desktopCapabilities.SetCapability("processName", "<name of the process>");
// optional - to identify the main window
desktopCapabilities.SetCapability("mainWindowTitle", "<name of the process>");
return new RemoteWebDriver(
new CommandExec(new Uri("http://127.0.0.1:4444"),
TimeSpan.FromSeconds(60)),
desktopCapabilities);
}
public static RemoteWebDriver CreateSessionByAttachingToRunningProcess()
{
DesiredCapabilities desktopCapabilities = new DesiredCapabilities();
desktopCapabilities.SetCapability("mode", "attach");
// attach to process using process name
desktopCapabilities.SetCapability("processName", "<name of the process to attach to>");
// with (optional)
desktopCapabilities.SetCapability("windowTitle", "<regular expression to narrow down the list of matching processes>");
// or attach to process using process id
desktopCapabilities.SetCapability("processId", "<id of the process to attach to>");
return new RemoteWebDriver(
new CommandExec(new Uri("http://127.0.0.1:4444"),
TimeSpan.FromSeconds(60)),
desktopCapabilities);
}
Рекомендуемое местоположение элемента использует экспрессию xPath (хотя с ограниченной поддержкой выражения)
var webBrowser = session.FindElement(By.XPath("//Pane[@AutomationId='webBrowser']"));
Механизмы местоположения элемента, которые поддерживаются
TextBox#id Windows в приложении Win не похожа на Windows в браузере. Windows ( ControlType.Window ) может быть вложена внутри дерева управления, например, в элемент Tab .
Окно может быть расположено либо с использованием xpath Expression var window = session.FindElement(By.XPath("/Window/Pane/Window[@AutomationId='WindowName']")); или переключившись на session.SwitchTo().Window("WindowName"); , в первом примере вы получите ссылку на элемент, в другом, внутренний контекст переключается на новое окно, а элементы, кэшируемые в течение следующих операций, могут быть утилизированы, когда окно складывается session.Close() .
Обратите внимание, что обертки элементов, такие как OpenQA.Selenium.Support.UI.SelectElement , не работают, потому что select элементы option .
Существует довольно некрасивый взлом, который обходит необходимость переключения окон при поиске детского окна, используя выражение XPath. По умолчанию поиск начинается с корневого элемента окна - главного окна или окна, на которое пользователь переключился - и поиск детского окна не удалось, поскольку оно не было прямым дочерним детьми текущего корня. Исправление запускает поиск окна на верхнем уровне.