Testing local project in Visual Studio using selen

2019-08-06 00:31发布

问题:

I am trying to set up a visual studio project with acceptance tests using NUnit and Selenium Web Driver, I would like to be able to "run tests" and this to start my web site, use selenium to run the tests and quit.

I have this basic setup so far:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using NUnit.Framework;
using OpenQA.Selenium;
using OpenQA.Selenium.PhantomJS;

namespace FrontEndTests.AcceptanceTests
{
[TestFixture]
class Phantom
{
    private PhantomJSDriver _driver;

    [SetUp]
    public void WhenOpeningANewWebPage()
    {
        _driver = new PhantomJSDriver();
        _driver.Navigate().GoToUrl(@"localhost");
    }

    [Test]
    public void ThenICanFindAClass()
    {
        Assert.NotNull(_driver.FindElement(By.ClassName("featured")));
    }

    [TearDown]
    public void Finally()
    {
        _driver.Quit();
    }

}
}

If I set the URL to 'www.google.com' the tests pass fine (with the correct class set) but localhost returns elementnotfoundexception in selenium.

How do I get it to work locally?

Thanks

回答1:

Well, you need to start you site before all tests or you can start it once in SetUp and kill it in TearDown (or if you are going to run your tests on some CI then run once before all tests and kill after all). To start it you can choose either webdev or iisexpress (on your choice), below sample of using WebDev.WebHost.dll

public class Phantom
    {
        private PhantomJSDriver _driver;
        //Move this field to base class if you need to start site before each test
        //e.g. you can move setup and teardown to base class, it's all up to you
        public DevServer WebDevServer { get; private set; }

        [SetUp]
        public void WhenOpeningANewWebPage()
        {
            WebDevServer = new DevServer();
            WebDevServer.Start();

            _driver = new PhantomJSDriver();
            _driver.Navigate().GoToUrl(@"localhost");
        }

        [Test]
        public void ThenICanFindAClass()
        {
            Assert.NotNull(_driver.FindElement(By.ClassName("featured")));
        }

        [TearDown]
        public void Finally()
        {
            _driver.Quit();
            WebDevServer.Stop();
        }

    }


    public class DevServer
    {
        private Server _webServer;

        public DirectoryInfo SourcePath { get; set; }

        public string VirtualPath { get; set; }

        public int Port { get; set; }

        public DevServer()
        {
            //Port
            Port = Settings.WebDevPort;
            //Path to your site folde
            SourcePath = Settings.WebDevSourcePath;
            //Virt path can be ~
            VirtualPath = Settings.WebDevVirtualPath;
        }

        public void Start()
        {
            Stop();

            try
            {
                _webServer = new Server(Port, VirtualPath, SourcePath.FullName);
                _webServer.Start();
            }
            catch (Exception e)
            {
                Trace.TraceError("Process cannot be started." + Environment.NewLine + e);
                throw;
            }
        }

        public void Stop()
        {
            if (_webServer != null)
            {
                _webServer.Stop();
                _webServer = null;
            }
        }
    }


回答2:

Based on this:

"When I run the project in visual studio it points to localhost:31106 I have tried to using this as the URL but this gives the same error - Gregg_1987"

IIS must be running your application. When you click run it starts the application in IIS express for the time that the application is running. Visual Studio then attaches to this for execution purposes.

If you are trying to execute Selenium on this you would have to install regular IIS and register the application through IIS so that it will be accessible. Then your tests can hit this through the URL registered in IIS. Otherwise you would have to try to programmatically execute the app using IIS express which there is some guidance on here: Automatically start ASP.MVC project when running test project

Once the site is accessible through IIS you can then hit it with your Selenium tests.