【问题标题】:Chrome crash when Selenium executed SendKeys(Key.Enter)Selenium 执行 SendKeys(Key.Enter) 时 Chrome 崩溃
【发布时间】:2019-07-29 03:16:43
【问题描述】:

我有一个自动化测试,下面有这行代码,用于在 sendkeys 之后输入搜索框:

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。

有人知道为什么会这样吗?提前致谢!

【问题讨论】:

  • 用元素的相关 HTML 更新问题
  • @DebanjanB 谢谢你的回复。我已将元素的 HTML 添加到我的问题中。
  • //*[@id='path'] 与您提供的 HTML 有什么关系?能否提供完整的错误跟踪日志?
  • 你的 chrome 和 chromedriver 版本是多少?也许是他们之间的冲突。检查此链接:chromedriver.chromium.org/downloads
  • @DebanjanB 抱歉回复慢。我刚刚编辑了 HTML 的 XPath。另外,我在上面提供了完整的错误日志。

标签: visual-studio selenium google-chrome automated-tests selenium-chromedriver


【解决方案1】:

查看一些文档,72.0.3626.121 似乎是与 Chromedriver 72.0.3626.69 不兼容的铬版本。据我所知,您有两种选择:

  1. 使用 Chrome 版本 72.0.3626.81,不要理会您的 chromedriver。

  2. 保留现有浏览器版本并使用chromedriver-72.0.3626.121-202.1.x86_64.rpm

=========

以上不是您的问题。继续……

我想我知道那条线有什么问题,

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

Keys.Enter 来自Keys class,首先,您必须导入(也许/可能您已经导入),但更重要的是它只能由Actions 调用。 here's 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);

【讨论】:

  • 我已将 Chrome 升级到版本 73.0.3683.86 并使用 ChromeDriver 版本 73.0.3683.68,但它似乎无法正常工作。执行 SendKeys(Key.Enter) 时仍然崩溃。
  • 根据您的描述,如果您调试缓慢通过它,我会高度怀疑时间问题。我将在我的答案中编辑一些内容,您可以尝试使您的脚本更好地工作。
  • 非常感谢!我试图将Thread.Sleep(3000); 放在SendKeys 行之上,但等待3 秒后它仍然崩溃。
  • @TàiHoàng 我很确定我知道那行有什么问题 - 请参阅我添加到答案底部的编辑。
  • @CPeck 我非常感谢您所做的所有工作。我已将您建议的代码添加到我自己的代码中,但它通过builder.SendKeys(standardUncontrolled, Keys.Enter); 行运行而无需输入。
猜你喜欢
  • 1970-01-01
  • 2018-01-04
  • 2016-03-13
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-10-11
  • 2015-05-26
  • 2014-07-19
相关资源
最近更新 更多