NUnit C#中的硒错误

软件测试 硒网络驱动程序 C#
2022-01-12 14:55:42

尝试运行此测试时出现以下错误:

TheNewTest : FailedSelenium.SeleniumException : 在 c:\Projects\WebDriver\trunk\dotnet\src\Selenium.Core\HttpCommandProcessor.cs 中的 Selenium.HttpCommandProcessor.DoCommand(String command, String[] args) 5000 毫秒后超时:第 100 行Class1.cs 中的 ClassLibrary1.NewTest.TheNewTest():第 66 行

这是代码:

using System;
using System.Text;
using System.Text.RegularExpressions;
using System.Threading;
using NUnit.Framework;
using Selenium;

namespace ClassLibrary1
{
    [TestFixture]

    public class NewTest
    {
        private ISelenium selenium;

        private StringBuilder verificationErrors;

        [SetUp]

        public void SetupTest()
        {
            selenium = new DefaultSelenium("localhost", 4444, "*firefox D:\\Program Files\\Mozilla Firefox\\firefox.exe",
            "http://www.google.com/");

            selenium.Start();

            verificationErrors = new StringBuilder();
        }

        [TearDown]

        public void TeardownTest()
        {
            try
            {
                selenium.Stop();
            }

            catch (Exception)
            {
                // Ignore errors if unable to close the browser
            }

            Assert.AreEqual("", verificationErrors.ToString());
        }
        [Test]

        public void TheNewTest()
        {
            // Open Google search engine.
            selenium.Open("http://www.google.com/");

            // Assert Title of page.
            Assert.AreEqual("Google", selenium.GetTitle());

            // Provide search term as "Selenium OpenQA"
            selenium.Type("q", "Selenium OpenQA");

            // Read the keyed search term and assert it.
            Assert.AreEqual("Selenium OpenQA", selenium.GetValue("q"));

            // Click on Search button.
            selenium.Click("btnG");

            // Wait for page to load.
            selenium.WaitForPageToLoad("5000");

            // Assert that "www.openqa.org" is available in search results.
            Assert.IsTrue(selenium.IsTextPresent("openqa.org"));

            // Assert that page title is - "Selenium OpenQA - Google Search"
            Assert.AreEqual("Selenium OpenQA - Google Search",
                         selenium.GetTitle());
        }
    }
}

我怀疑线路有问题,selenium.WaitForPageToLoad("5000");但我不知道如何解决。

你也可以在这里下载我的代码:http: //dl.dropbox.com/u/20422001/ClassLibrary1.zip

请帮忙。谢谢!

编辑 1

我必须手动刷新浏览器才能通过该行selenium.WaitForPageToLoad(timeout);我该如何解决这个问题?

编辑 2

事情开始变得越来越有趣!

我将代码更改为在 Altavista 搜索网站 (www.altavista.com) 上进行搜索,它可以正常工作!不知何故,我不知道为什么它看起来像“selenium.WaitForPageToLoad(timeout);” 不适用于 Google 搜索网站,但适用于 Altavista 搜索网站 只有我吗?我仍然很好奇,想让它也适用于谷歌的网站,请帮忙。

编辑 3:2011 年 8 月 10 日

我现在距离这个问题的最终解决方案还有一步。感谢“stuartf”指出此问题的根本原因是因为 Google 使用 Ajax 调用搜索结果。

现在,对于这个问题,我有一个“便宜的解决方案”,这是我在加载 ajax 页面时为“检测”所做的:

while (seconds < 30)
{
    //Check whether the results page is loaded.
    if (selenium.GetTitle() == "Selenium OpenQA - Google Search")
    {
        break;
    }
    Thread.Sleep(1000);
    seconds++;
}     
Assert.IsTrue(selenium.IsTextPresent("openqa.org"));       

是的,它通过检查搜索结果页面标题来工作,但在我看来它仍然不太可靠。有没有更好的方法来检查ajax页面是否加载?就像是:

if (selenium.isElementPresent("link=ajaxLink"))

问题是,我们如何找到“ajaxLink”?

2个回答

WaitForPageToLoad方法在这里不起作用,因为当您开始输入时,Google 现在会在 AJAX 调用中返回结果。最好的做法是等待页面上存在已知的内容,然后再继续。

例如,您可以轮询页面以检查 if selenium.IsTextPresent("openqa.org")is true,如果它没有循环回来,然后再试一次。只要记住在指定的时间长度后超时。

另一个想法是用 aThreading.Sleep(5000)代替WaitForPageToLoad方法,这将导致测试暂停 5 秒。这不是一个很好的做法,因为您的测试不会花费至少 5 秒的时间来运行,而实际上测试完成的速度可能比这快得多。

我希望这有帮助!

做了

selenium.WaitForPageToLoad("60000");

或者更好的是,让 timeout 成为一个变量并使用它,这样你就不必到处硬编码了:

String timeout = "60000";
selenium.WaitForPageToLoad(timeout);