15

我正在使用 Selenium、C#、NUnit 编写测试,有时我会遇到以下错误:-

OpenQA.Selenium.WebDriverException:服务器没有响应 url httр://lоcalhost:7055/hub/session/8dd13f5c-7ca6-4aa6-babc-f0ff6d940f0a/element

这是堆栈跟踪:

OpenQA.Selenium.WebDriverException:在 OpenQA.Selenium.Remote.HttpCommandExecutor.CreateResponse(WebRequest request) 中的 url httр://localhost:7055/hub/session/8dd13f5c-7ca6-4aa6-babc-f0ff6d940f0a/element 没有来自服务器的响应c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\HttpCommandExecutor.cs:c:\Projects\WebDriver\trunk\dotnet\src 中 OpenQA.Selenium.Remote.HttpCommandExecutor.Execute(Command commandToExecute) 的第 115 行\WebDriver\Remote\HttpCommandExecutor.cs:OpenQA.Selenium.Firefox.Internal.ExtensionConnection.Execute(Command commandToExecute) 的第 96 行,位于 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Firefox\Internal\ExtensionConnection.cs :OpenQA.Selenium.Remote.RemoteWebDriver.Execute(String driverCommandToExecute,Dictionary`2 参数)的第 128 行:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:c:\Projects\WebDriver\trunk\dotnet\ 中 OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(字符串机制,字符串值)的第 795 行src\WebDriver\Remote\RemoteWebDriver.cs:第 836 行在 OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById(String id) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:line 431在 OpenQA.Selenium.By.<>c__DisplayClass2.b__0(ISearchContext context) in c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:OpenQA.Selenium.By.FindElement(ISearchContext context) 的第 102 行在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:line 272 at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by) in c:\Projects\WebDriver\trunk\dotnet\src\ WebDriver\Remote\RemoteWebDriver.cs:第 289 行Selenium.Remote.RemoteWebDriver.FindElement(字符串机制,字符串值)在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById 的第 836 行(字符串id) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:line 431 at OpenQA.Selenium.By.<>c__DisplayClass2.b__0(ISearchContext context) in c:\Projects\WebDriver\ trunk\dotnet\src\WebDriver\By.cs:OpenQA.Selenium.By.FindElement(ISearchContext context) 中的第 102 行,位于 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:OpenQA 的第 272 行.Selenium.Remote.RemoteWebDriver.FindElement(By by) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:line 289 atSelenium.Remote.RemoteWebDriver.FindElement(字符串机制,字符串值)在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById 的第 836 行(字符串id) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:line 431 at OpenQA.Selenium.By.<>c__DisplayClass2.b__0(ISearchContext context) in c:\Projects\WebDriver\ trunk\dotnet\src\WebDriver\By.cs:OpenQA.Selenium.By.FindElement(ISearchContext context) 中的第 102 行,位于 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:OpenQA 的第 272 行.Selenium.Remote.RemoteWebDriver.FindElement(By by) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:line 289 at\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:第 836 行,位于 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver 中的 OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById(String id) \Remote\RemoteWebDriver.cs:OpenQA.Selenium.By.<>c__DisplayClass2.b__0(ISearchContext context) 中的第 431 行在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:OpenQA 的第 102 行。 Selenium.By.FindElement(ISearchContext context) in c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:line 272 at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by) in c:\Projects \WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:第 289 行\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:第 836 行,位于 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver 中的 OpenQA.Selenium.Remote.RemoteWebDriver.FindElementById(String id) \Remote\RemoteWebDriver.cs:OpenQA.Selenium.By.<>c__DisplayClass2.b__0(ISearchContext context) 中的第 431 行在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:OpenQA 的第 102 行。 Selenium.By.FindElement(ISearchContext context) in c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:line 272 at OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by) in c:\Projects \WebDriver\trunk\dotnet\src\WebDriver\Remote\RemoteWebDriver.cs:第 289 行Selenium.By.<>c__DisplayClass2.b__0(ISearchContext context) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:OpenQA.Selenium.By.FindElement(ISearchContext context) 的第 102 行 in c: \Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:第 272 行在 OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote \RemoteWebDriver.cs:第 289 行Selenium.By.<>c__DisplayClass2.b__0(ISearchContext context) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:OpenQA.Selenium.By.FindElement(ISearchContext context) 的第 102 行 in c: \Projects\WebDriver\trunk\dotnet\src\WebDriver\By.cs:第 272 行在 OpenQA.Selenium.Remote.RemoteWebDriver.FindElement(By by) 在 c:\Projects\WebDriver\trunk\dotnet\src\WebDriver\Remote \RemoteWebDriver.cs:第 289 行

.####.##.#####.#########.#####.ShareServicesTest.CreateShareWidget()

出现此错误的代码:

Driver.SwitchTo().Frame(frameElement);    
var wait = new WebDriverWait(parentContextable.Context.Driver, Timeout);
IWebElement element = wait.Until(d => Driver.FindElement(By.TagName(Tags.Body))); // error in this line

我发现这个错误只能在这几行 Selenium 实现代码中抛出:

private static Response CreateResponse(WebRequest request)
        {
            Response commandResponse = new Response();

            HttpWebResponse webResponse = null;
            try
            {
                webResponse = (HttpWebResponse)request.GetResponse();
            }
            catch (WebException ex)
            {
                webResponse = (HttpWebResponse)ex.Response;
            }

            if (webResponse == null)
            {
                throw new WebDriverException("No response from server for url " + request.RequestUri.AbsoluteUri);
            }
            else
            { ...

也许有人知道为什么 request.GetResponse() 返回 null,或者如果失败,为什么 ex.Response 也为 null?

(09.09.2012) 抱歉,也许我没有提供所有信息。我正在使用 FireFox 驱动程序、Win7、Selenium 2.25.1。我的测试有时会失败。在调试模式下测试失败的频率低于在发布模式下。

在这里,我找到了发生这种情况的可能原因。如果我写这样的代码:

Driver.SwitchTo().Frame(frameElement);    
var wait = new WebDriverWait(parentContextable.Context.Driver, Timeout);
Tread.Sleep(250);
IWebElement element = wait.Until(d => Driver.FindElement(By.TagName(Tags.Body)));

测试运行正常。但是 Thread.Sleep 是不好的解决方案。也许有人可以找到另一个更好的解决方案。

4

3 回答 3

1

你用的是IE吗?我得到了这个,直到我发现我可以通过对象上的配置来设置基本 URL。否则,它带你到的第一页是由 Selenium 生成的,它似乎错过了“真实”请求的线索。

 var options = new InternetExplorerOptions()
 {
     InitialBrowserUrl = _baseUrl,
     IntroduceInstabilityByIgnoringProtectedModeSettings = true
 };

 _driver = new InternetExplorerDriver(_ieDriverServerPath, options);

TextFixtureSetup在测试中的一种方法中使用它。

于 2012-09-07T16:32:31.470 回答
0

我有同样的问题并以这种方式解决:

a) 避免使用诸如'do wity retry'之类的方法来操作 IWebElements,因为这样测试需要花费很多时间来运行,这是不必要的,并且测试会间歇性地失败。

b) 将 Firefox 版本降级到 5(可能从 FF 3.6 到 6 可以正常工作,但新版本的 FF 会引发间歇性异常,例如“集线器/会话无响应...”

c) 如果您需要在页面上处理通过 Ajax 加载的测试中的元素,请务必提供一个可以停止元素加载的 js 函数,因此您应该在 FindElement 和do what you want.

于 2013-03-14T21:03:48.623 回答