Сбой Chrome, когда Selenium запускает SendKeys (Key.Enter) - PullRequest
2 голосов
/ 07 марта 2019

У меня есть тест автоматизации, в котором приведена следующая строка кода, она предназначена для ввода в строку поиска после отправки ключей:

driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).SendKeys("@Auto");
driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).SendKeys(Keys.Enter);

Отлично работает, когда я медленно запускаю его в режиме отладки. Но без режима отладки Chrome будет аварийно завершать работу при выполнении SendKeys(Keys.Enter), и Visual Studio отобразит это сообщение:

Message: Test method threw exception: 
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:64847
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 System.Net.HttpWebRequest.GetRequestStream(TransportContext& context)
at System.Net.HttpWebRequest.GetRequestStream()
at OpenQA.Selenium.Remote.HttpCommandExecutor.MakeHttpRequest(HttpRequestInfo requestInfo)
at OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute)
at OpenQA.Selenium.Remote.DriverServiceCommandExecutor.Execute(Command commandToExecute)
at OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute, Dictionary`2 parameters)

Это HTML-код элемента, с которым я столкнулся

<th class="jss1543 jss1544 jss1534 jss1527 percent-40" scope="col">
    <div class="jss1536">
        <div class="jss1551 jss1552 jss1528">
            <div class="jss1568 jss1555 jss1530 jss1569 jss1556">
                <input aria-invalid="false" class="jss1578 jss1563 jss1531" id="standard-uncontrolled" placeholder="Search" type="text" value="">
            </div>
        </div>
    </div>
</th>

Обновите скрипт, который я использую:

using System;
using System.Text;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using OpenQA.Selenium;
using OpenQA.Selenium.Chrome;
using OpenQA.Selenium.Support.UI;
using SeleniumExtras.WaitHelpers;
using OpenQA.Selenium.Interactions;
using System.Threading;

namespace AutoKaercher
{
    [TestClass]

    public class CRUD_Languages
    {
        private TestContext testContextInstance;
        private IWebDriver driver;
        private string intranetURL;
        private string languagesName;
        private string languagesCode;

        [TestMethod]
        [TestCategory("Chrome")]
        public void _CRUD_Languages()
        {
            WebDriverWait wait = new WebDriverWait(driver, TimeSpan.FromSeconds(10));

            //Login
            driver.Navigate().GoToUrl(intranetURL + "/");
            driver.Manage().Window.Maximize();
            driver.FindElement(By.Name("username")).SendKeys("globaladmin");
            driver.FindElement(By.Name("password")).SendKeys("1234@Abcd");
            driver.FindElement(By.XPath("//*[@id='root']/div/div[2]/div/form/div[2]/div[3]/button")).Click();

            //Go to Languages
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='root']/div/div[2]/header/div/div/div[1]/span[2]"))).Click();
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='root']/div/header/nav/div/ul/li[1]"))).Click();

            //Create Languages
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[1]/div/button"))).Click();
            driver.FindElement(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[1]/div/div/input")).SendKeys("@Automation Testing");
            driver.FindElement(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[2]/div/div/input")).SendKeys("@AT");
            driver.FindElement(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[4]/button[2]")).Click();

            //Check for create Languages successfully
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='root']/div/div[1]/div/div"))).Click();
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr[1]/td[1]")));
            driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).SendKeys("@Auto");
            driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).SendKeys(Keys.Enter);

            //IWebElement searchLanguage = driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']"));
            //searchLanguage.SendKeys("@Auto");
            //Actions inputEnter = new Actions(driver);
            //inputEnter.SendKeys(searchLanguage, Keys.Enter);

            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr[1]/td[1]")));
            languagesName = driver.FindElement(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr/td[1]")).Text;
            languagesCode = driver.FindElement(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr/td[2]")).Text;
            if (languagesName != "@Automation Testing")
            {
                driver.Quit();
            }
            if (languagesCode != "@AT")
            {
                driver.Quit();
            }

            //Edit Languages
            driver.FindElement(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr/td[3]/div/span[1]")).Click();
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementIsVisible(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[1]/div/div/input"))).Clear();
            driver.FindElement(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[1]/div/div/input")).SendKeys("@Automation Testing Edited");
            driver.FindElement(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[2]/div/div/input")).Clear();
            driver.FindElement(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[2]/div/div/input")).SendKeys("@AT-@at");
            driver.FindElement(By.XPath("//*[@id='body']/div[2]/div[2]/div[2]/div/div[6]/button[2]")).Click();

            //Check for edit Languages successfully
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='root']/div/div[1]/div/div"))).Click();
            languagesName = driver.FindElement(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr/td[1]")).Text;
            languagesCode = driver.FindElement(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr/td[2]")).Text;
            if (languagesName != "@Automation Testing Edited")
            {
                driver.Quit();
            }
            if (languagesCode != "@AT-@at")
            {
                driver.Quit();
            }

            //Delete Languages
            driver.FindElement(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr/td[3]/div/span[2]")).Click();
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='intranet-dialog']/div[2]/div/div/div[3]/button[2]"))).Click();

            //Check for delete Languages successfully
            wait.Until(SeleniumExtras.WaitHelpers.ExpectedConditions.ElementToBeClickable(By.XPath("//*[@id='root']/div/div[1]/div/div"))).Click();
            driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).Clear();
            driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).SendKeys("@Auto");
            driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).SendKeys(Keys.Enter);
            if (driver.FindElements(By.XPath("//*[@id='root']/div/div[3]/div/div[1]/div[2]/div/table/tbody/tr/td[1]")).Count != 0)
            {
                driver.Quit();
            }

        }

        public TestContext TestContext
        {
            get
            {
                return testContextInstance;
            }
            set
            {
                testContextInstance = value;
            }
        }

        [TestInitialize()]
        public void SetupTest()
        {
            intranetURL = "https://rkistage.app.kaercher.com";

            //Open Chrome in Incognito mode
            ChromeOptions options = new ChromeOptions();
            options.AddArguments("--incognito");
            driver = new ChromeDriver(options);

            driver.Manage().Timeouts().PageLoad = TimeSpan.FromSeconds(10);
            driver.Manage().Timeouts().ImplicitWait = TimeSpan.FromSeconds(5);

        }

        [TestCleanup()]
        public void MyTestCleanup()
        {
            driver.Quit();
        }
    }
}

Я использую Chrome версии 73.0.3683.86 и ChromeDriver версии 73.0.3683.68.

У кого-нибудь есть идея, почему это происходит? Заранее спасибо!

1 Ответ

1 голос
/ 23 марта 2019

Глядя на некоторые документы, кажется, что 72.0.3626.121 - это версия хрома, которая не совместима с Chromedriver 72.0.3626.69.Насколько я могу судить, у вас есть два варианта:

  1. Используйте версию Chrome 72.0.3626.81 и оставьте свой хромированный драйвер в покое.

  2. Сохраните версию браузера и используйте chromedriver-72.0.3626.121-202.1.x86_64.rpm

=========

Выше не было вашей проблемы.Двигаясь дальше ...

Мне кажется, я знаю, что не так с этой строкой,

driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']")).SendKeys(Keys.Enter);

Keys.Enter из Keys класса ,который, прежде всего, вы должны импортировать (возможно / возможно, вы уже сделали), но, что более важно, он может быть вызван только Actions вот SendKeys Я думаю , который вы использовали.Обратите внимание на предупреждение об устаревании: [Obsolete("Use the Actions or ActionBuilder class to simulate keyboard input.")].

Так или иначе, если вы попробуете следующее, я думаю, что это должно работать.

using OpenQA.Selenium.Keys
using OpenQA.Selenium.Interactions;

IWebElement standardUncontrolled = driver.FindElement(By.XPath("//*[@id='standard-uncontrolled']"));
standardUncontrolled.SendKeys("@Auto");


Actions builder = new Actions(driver);        
builder.SendKeys(standardUncontrolled, Keys.Enter).Perform();
Thread.Sleep(1000);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...