WinAppDriver WindowsDriver<WindowsElement> проблемы с URL

У меня есть решение, на самом деле это демонстрация того, как должен работать Win App Driver, но я не могу заставить его работать. Использование Win App Driver с селеном и веб-драйверами appium (как упоминалось в 5 минутах видео). У меня есть решение, показанное ниже, и когда я запускаю свой тест AddAlarm, я получаю сообщение об ошибке... "целевой компьютер активно отклонил его 127.0.0.1:4723".

Полное сообщение об ошибке находится внизу этого поста.

У меня вопрос: что мне нужно сделать, чтобы приложение, которое мы тестируем "Alarm & Clock", действительно запускалось по URL 127.0.0.1:4723, нужно ли что-то сделать, чтобы сделать его доступным на этом URL / порте? Кроме того, как я могу убедиться, что "app" и "Microsoft.WindowsAlarms_8wekyb3d8bbwe!App" верны в настройке?

//Class with my test "AddAlarm"
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.Appium.Windows;
using System.Threading;
using System;

namespace AlarmClockTest
{
    [TestClass]
    public class ScenarioAlarm : AutoTest_SynTQ.UnitTestSession
    {
        private const string NewAlarmName = "Sample Test Alarm";

        [TestMethod]
        public void AlarmAdd()
        {
            // Navigate to New Alarm page
            session.FindElementByAccessibilityId("AddAlarmButton").Click();

            // Set alarm name
            session.FindElementByAccessibilityId("AlarmNameTextBox").Clear();
            session.FindElementByAccessibilityId("AlarmNameTextBox").SendKeys(NewAlarmName);

            // Set alarm hour
            WindowsElement hourSelector = session.FindElementByAccessibilityId("HourLoopingSelector");
            hourSelector.FindElementByName("3").Click();
            Assert.AreEqual("3", hourSelector.Text);

            // Set alarm minute
            WindowsElement minuteSelector = session.FindElementByAccessibilityId("MinuteLoopingSelector");
            minuteSelector.FindElementByName("55").Click();
            Assert.AreEqual("55", minuteSelector.Text);

            // Save the newly configured alarm
            session.FindElementByAccessibilityId("AlarmSaveButton").Click();
            Thread.Sleep(TimeSpan.FromSeconds(3));

            // Verify that a new alarm entry is created with the given hour, minute, and name
            WindowsElement alarmEntry = session.FindElementByXPath($"//ListItem[starts-with(@Name, \"{NewAlarmName}\")]");
            Assert.IsNotNull(alarmEntry);
            Assert.IsTrue(alarmEntry.Text.Contains("3"));
            Assert.IsTrue(alarmEntry.Text.Contains("55"));
            Assert.IsTrue(alarmEntry.Text.Contains(NewAlarmName));

            // Verify that the alarm is active and deactivate it
            WindowsElement alarmEntryToggleSwitch = alarmEntry.FindElementByAccessibilityId("AlarmToggleSwitch") as WindowsElement;
            Assert.IsTrue(alarmEntryToggleSwitch.Selected);
            alarmEntryToggleSwitch.Click();
            Assert.IsFalse(alarmEntryToggleSwitch.Selected);
        }


        [ClassInitialize]
        public static void ClassInitialize(TestContext context)
        {
            Setup(context);
        }

        [ClassCleanup]
        public static void ClassCleanup()
        {
            // Try to delete any alarm entry that may have been created
            while (true)
            {
                try
                {
                    var alarmEntry = session.FindElementByXPath($"//ListItem[starts-with(@Name, \"{NewAlarmName}\")]");
                    session.Mouse.ContextClick(alarmEntry.Coordinates);
                    session.FindElementByName("Delete").Click();
                }
                catch
                {
                    break;
                }
            }

            TearDown();
        }

        [TestInitialize]
        public override void TestInit()
        {
            // Invoke base class test initialization to ensure that the app is in the main page
            base.TestInit();

            // Navigate to Alarm tab
            session.FindElementByAccessibilityId("AlarmPivotItem").Click();
        }
    }
}




//Inherited class below
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium.Appium.Windows;
using OpenQA.Selenium.Remote;
using System;
using System.Threading;

namespace AutoTest_SynTQ
{
    [TestClass]
    public class UnitTestSession
    {
        private const string WindowsApplicationDriverUrl = "http://127.0.0.1:4723";
        private const string AlarmClockAppId = "Microsoft.WindowsAlarms_8wekyb3d8bbwe!App";

        protected static WindowsDriver<WindowsElement> session;
        protected static RemoteTouchScreen touchScreen;

        public static void Setup(TestContext context)
        {
            // Launch Alarms & Clock application if it is not yet launched
            if (session == null || touchScreen == null)
            {
                TearDown();

                // Create a new session to bring up the Alarms & Clock application
                DesiredCapabilities appCapabilities = new DesiredCapabilities();
                appCapabilities.SetCapability("app", AlarmClockAppId);
                session = new WindowsDriver<WindowsElement>(new Uri(WindowsApplicationDriverUrl), appCapabilities);
                Assert.IsNotNull(session);
                Assert.IsNotNull(session.SessionId);

                // Set implicit timeout to 1.5 seconds to make element search to retry every 500 ms for at most three times
                session.Manage().Timeouts().ImplicitlyWait(TimeSpan.FromSeconds(1.5));

                // Initialize touch screen object
                touchScreen = new RemoteTouchScreen(session);
                Assert.IsNotNull(touchScreen);
            }
        }

        public static void TearDown()
        {
            // Cleanup RemoteTouchScreen object if initialized
            touchScreen = null;

            // Close the application and delete the session
            if (session != null)
            {
                session.Quit();
                session = null;
            }
        }

        [TestInitialize]
        public virtual void TestInit()
        {
            WindowsElement alarmTabElement = null;

            // Attempt to go back to the main page in case Alarms & Clock app is started in EditAlarm view
            try
            {
                alarmTabElement = session.FindElementByAccessibilityId("AlarmPivotItem");
            }
            catch
            {
                // Click back button if application is in a nested page such as New Alarm or New Timer
                session.FindElementByAccessibilityId("Back").Click();
                Thread.Sleep(TimeSpan.FromSeconds(1));
                alarmTabElement = session.FindElementByAccessibilityId("AlarmPivotItem");
            }

            // Verify that the app is in the main view showing alarmTabElement
            Assert.IsNotNull(alarmTabElement);
            Assert.IsTrue(alarmTabElement.Displayed);
        }
    }
}

Имя теста: AlarmAdd Test FullName: AlarmClockTest.ScenarioAlarm.AlarmAdd Источник теста: C:\Users\ECombe.OPTIDOORS\Documents\SynTQCodedUITesting\AutoTest_SynTQ\SCN_Alarm.cs: строка 30 Результат теста: Сбой теста Продолжительность теста: 0:00:00

Результат StackTrace:
в OpenQA.Selenium.Remote.RemoteWebDriver.UnpackAndThrowOnError(Response errorResponse) в OpenQA.Selenium.Remote.RemoteWebDriver.Execute (String driverCommandToExecute, Dictionary2 parameters) at OpenQA.Selenium.Remote.RemoteWebDriver.StartSession(ICapabilities desiredCapabilities) at OpenQA.Selenium.Remote.RemoteWebDriver..ctor(ICommandExecutor commandExecutor, ICapabilities desiredCapabilities) at OpenQA.Selenium.Appium.AppiumDriver1..ctor (Uri remoteAddress, ICapabilities requiredCapabilities) в OpenQA.Selenium.Appium.Windows.WindowsDriver1..ctor(Uri remoteAddress, DesiredCapabilities desiredCapabilities) at AutoTest_SynTQ.UnitTestSession.Setup(TestContext context) in C:\Users\ECombe.OPTIDOORS\Documents\SynTQCodedUITesting\AutoTest_SynTQ\UnitTestSession.cs:line 28 at AlarmClockTest.ScenarioAlarm.ClassInitialize(TestContext context) in C:\Users\ECombe.OPTIDOORS\Documents\SynTQCodedUITesting\AutoTest_SynTQ\SCN_Alarm.cs:line 71 Result Message: Class Initialization method AlarmClockTest.ScenarioAlarm.ClassInitialize threw exception. OpenQA.Selenium.WebDriverException: OpenQA.Selenium.WebDriverException: Unexpected error. System.Net.WebException: Unable to connect to the remote server ---> System.Net.Sockets.SocketException: No connection could be made because the target machine actively refused it 127.0.0.1:4723 at System.Net.Sockets.Socket.DoConnect(EndPoint endPointSnapshot, SocketAddress socketAddress) at System.Net.ServicePoint.ConnectSocketInternal(Boolean connectFailure, Socket s4, Socket s6, Socket& socket, IPAddress& address, ConnectSocketState state, IAsyncResult asyncResult, Exception& exception) --- End of inner exception stack trace --- at OpenQA.Selenium.Appium.Service.AppiumCommandExecutor.Execute(Command commandToExecute) at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary2 параметра).

1 ответ

Ответ в моем случае заключался в использовании режима разработчика. Фактической проблемой было закрытие winappdriver.exe немедленно. Подробнее здесь.

Другие вопросы по тегам