winforms 是否可以将Selenium与包含WebBrowser对象的C# windows窗体一起使用?

oogrdqng  于 2022-11-17  发布在  C#
关注(0)|答案(5)|浏览(212)

我想知道是否可以将Selenium与包含WebBrowser对象的C# Windows窗体一起使用。
我正在使用Selenium,并且能够使用Selenium脚本记录创建测试用例;我只是想确定我是否可以导出C#代码,并让它在C#环境中运行。我感谢任何想法或解释。

update我已经到了让Selenium打开包含WebBrowser组件的WinForm的地步。但是,从那里我的测试无法执行。看起来它不理解selenium命令。但是,我没有看到任何错误消息被抛出。hmmm

这个问题是winformWithWebBrowserTest.exe,它打开了带有webbrowser的winForm。但是什么都没有发生。下面的代码是启动.exe的代码

测试代码(Selenium命令)

namespace ClassLibrary1
{
    class Class2
    {
        private ISelenium selenium;
        private StringBuilder verificationErrors;

        [SetUp]
        public void SetupTest()
        {

            selenium = new DefaultSelenium
                ("localhost", 4444, "*custom C:\\Users\\m-tak\\Documents\\Visual Studio 2010\\Projects\\winformWithWebBrowserTest\\winformWithWebBrowserTest\\bin\\Release\\winformWithWebBrowserTest.exe", "http://www.livemocha.com");

            selenium.Start();
            verificationErrors = new StringBuilder();
        }

        [TearDown]
        public void TeardownTest()
        {
            selenium.Stop();
        }

        [Test]
        public void TheUntitledTest()
        {
            //nothing here gets executed :(
            Console.WriteLine("foobar front");
            selenium.Open("/");
            Console.WriteLine("foobar");
            selenium.WaitForPageToLoad("30000");
            selenium.Open("/users/logout");
            selenium.Open("/users/login");

        }

    }
}

.可执行文件

namespace WindowsFormsApplication1
{
    public partial class Form1 : Form
    {
        public Form1()
        {
            InitializeComponent();
        }

        private void webBrowser1_DocumentCompleted(object sender, WebBrowserDocumentCompletedEventArgs e)
        {
           //this gets executed always......
            HtmlElement head = webBrowser1.Document.GetElementsByTagName("body")[0]; 
            HtmlElement scriptOne = webBrowser1.Document.CreateElement("script");
            IHTMLScriptElement element = (IHTMLScriptElement)scriptOne.DomElement;
            element.text = "function sayHello() { " + 
                "alert('hello');" +
                " }" ;
            head.AppendChild(scriptOne);
            webBrowser1.Document.InvokeScript("sayHello");

        }
        //getter setter..... 
        public WebBrowser getWebBrowser() 
        {
            return this.webBrowser1;

        }
        public void setWebBrowser(WebBrowser wb) 
        {
            this.webBrowser1 = wb;
        }

        //just address bar
        private void button1_Click(object sender, EventArgs e)
        {
            if (!string.IsNullOrEmpty(textBox1.Text))
            {
                webBrowser1.Navigate(textBox1.Text);
            }
        }

        //just address bar
        private void webBrowser1_Navigated(object sender, WebBrowserNavigatedEventArgs e)
        {
            if (textBox1.Text != e.Url.ToString())
            {
                textBox1.Text = e.Url.ToString();
            }
        }

    }
}

更新

我使我的测试变得简单,所以现在我不使用NUnit。我创建了C#控制台应用程序,只是为了运行c# .exe文件。但在我的控制台中,它将输出"--1--"和“--2--" only..”

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Web;
using Selenium;

namespace ConsoleApplication1
{
    class Program
    {
        static void Main(string[] args)
        {

            Console.WriteLine("-- 1---");
            ISelenium selenium;

            selenium = new DefaultSelenium
                ("localhost", 4444, "*custom C:\\Users\\m-takayashiki\\Documents\\Visual Studio 2010\\Projects\\winformWithWebBrowserTest\\winformWithWebBrowserTest\\bin\\Release\\winformWithWebBrowserTest.exe", "http://www.livemocha.com");

            Console.WriteLine("-- 2---");

            selenium.Start();

            Console.WriteLine("-- 3---");

            selenium.Open("/");
            selenium.WaitForPageToLoad("30000");
            selenium.Open("/users/logout");
            selenium.Open("/users/login");

            Console.WriteLine("test test test");

            //tear down
            selenium.Stop();

        }
    }
}

更新

我检查了RC日志:

15:40:35.379 DEBUG [13] org.openqa.jetty.http.HttpContext - Handler org.openqa.selenium.server.SeleniumDriverResourceHandler in HttpContext[/selenium-server,/selenium-server]
15:40:35.380 DEBUG [13] org.openqa.selenium.server.SeleniumDriverResourceHandler - req: POST /selenium-server/driver/ HTTP/1.1
Content-Type: application/x-www-form-urlencoded; charset=utf-8
Host: localhost:4444
Content-Length: 247
Expect: 100-continue
Connection: keep-alive

15:40:45.408 DEBUG [13] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for window 'null' local frame 'null' for 1790 more secs
15:40:45.408 DEBUG [13] org.openqa.selenium.server.FrameGroupCommandQueueSet - waiting for condition for 1000 more ms
15:40:45.945 DEBUG [12] org.openqa.selenium.server.FrameGroupCommandQueueSet - got condition? : false
vjrehmav

vjrehmav1#

我还没有对Selenium进行过这样的操作,但是当我想自动化InfoPath时,我对WatiN进行了同样的操作。我采用的方法如下:
1.关闭所有具有该名称的进程在我的例子中是“infopath”

foreach (Process proc in Process.GetProcessesByName("infopath"))
{    
  proc.Kill();
}

1.启动测试应用程序,调用Process.GetProcessesByName获取所有进程的id,然后获取第一个进程的窗口句柄,因为应该只有一个进程在运行。

Process[] updatedInfopathProcessList = Process.GetProcessesByName("infopath");
if (updatedInfopathProcessList[0].Id == 0)
{
    throw new ApplicationException("No Infopath processes exist");
}
infopathProcessId = updatedInfopathProcessList[0].Id;
infopathHwnd = updatedInfopathProcessList[0].MainWindowHandle;

1.现在我有了窗口句柄,我得到了IHTMLDocument2,以便使用WatiN自动化。

InternalHTMLDOMDocument = IEDom.IEDOMFromhWnd(this.hWnd);

真实的的橡胶击中道路在IEDom类...代码如下..

namespace ItiN
    {
        public class IEDom
        {

            internal static IHTMLDocument2 IEDOMFromhWnd(IntPtr hWnd)
            {
                Guid IID_IHTMLDocument2 = new Guid("626FC520-A41E-11CF-A731-00A0C9082637");

                Int32 lRes = 0;
                Int32 lMsg;
                Int32 hr;

                //if (IsIETridentDlgFrame(hWnd))
                //{
                    if (!IsIEServerWindow(hWnd))
                    {
                        // Get 1st child IE server window
                        hWnd = NativeMethods.GetChildWindowHwnd(hWnd, "Internet Explorer_Server");
                    }

                    if (IsIEServerWindow(hWnd))
                    {
                        // Register the message
                        lMsg = NativeMethods.RegisterWindowMessage("WM_HTML_GETOBJECT");
                        // Get the object
                        NativeMethods.SendMessageTimeout(hWnd, lMsg, 0, 0, NativeMethods.SMTO_ABORTIFHUNG, 1000, ref lRes);
                        if (lRes != 0)
                        {
                            // Get the object from lRes
                            IHTMLDocument2 ieDOMFromhWnd = null;
                            hr = NativeMethods.ObjectFromLresult(lRes, ref IID_IHTMLDocument2, 0, ref ieDOMFromhWnd);
                            if (hr != 0)
                            {
                                throw new COMException("ObjectFromLresult has thrown an exception", hr);
                            }
                            return ieDOMFromhWnd;
                        }
                    }
               // }
                return null;
            }

            internal static bool IsIETridentDlgFrame(IntPtr hWnd)
            {
                return UtilityClass.CompareClassNames(hWnd, "Internet Explorer_TridentDlgFrame");
            }

            private static bool IsIEServerWindow(IntPtr hWnd)
            {
                return UtilityClass.CompareClassNames(hWnd, "Internet Explorer_Server");
            }
        }
    }

对不起,这不是 selenium ,但这是我如何解决问题的WatiN,所以我希望它可以帮助。代码在这里http://itin.codeplex.com/,我也认为这已被添加到WatiN以及。

knsnq2tg

knsnq2tg2#

从理论上讲,只要Selenium能够将JS注入浏览器组件,它就可以工作。您需要使用 *custom命令并传入您希望Selenium启动的可执行文件,然后它将尝试执行您想要的操作。

ekqde3dh

ekqde3dh3#

我想你可以,但是你可能必须使用Selenium RC。它有一个.Net版本的Selenium API。

mhd8tkvw

mhd8tkvw4#

我们稍微破解了selenium webdriver代码,将其附加到Windows应用程序中的嵌入式IE示例。http://bradbax.blogspot.ca/2013/07/driving-embedded-wpf-browser-with.html

pxy2qtax

pxy2qtax5#

目前我还没有测试它,但它应该可以通过一个远程调试浏览器示例实现,如下所述:https://stackoverflow.com/a/70069612/13163366

相关问题