Можно ли запустить тестовый код WatiN внешне для целевого кода C#?
Моя цель - автоматизировать тестирование в.NET WebBrowser. Приведенный ниже код прекрасно работает, если я поместил свой тестовый код WatiN в тот же файл.
Код:
namespace WindowsFormsApplication1
{
public partial class Form1 : System.Windows.Forms.Form
{
public Form1()
{
InitializeComponent();
}
}
private void Form1_Load(object sender, EventArgs e)
{
//I have WebBrowser control in the form
//so the WatiN code below works
var t = new Thread(() =>
{
Settings.AutoStartDialogWatcher = false;
var ie = new IE(webBrowser1.ActiveXInstance);
ie.GoTo("http://www.google.com");
ie.TextField(Find.ByClass("lst")).TypeText("this is awesome!!");
ie.Button(Find.ByName("btnG")).Click();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
}//end form load
}//end class
}//end namespace
Но не стоит смешивать тестовый код и целевой код. Поэтому я хотел бы взять часть тестового кода WatiN и поместить ее в отдельный файл C# в отдельный проект. Но тогда, если я это сделаю, я потеряю ссылку на Форму, конечно.
Я искал что-то под названием WndProc (http://dotnet.sys-con.com/node/39039), но, похоже, это не совсем то, что я ищу.
Итак, мой вопрос:
Можно ли отделить код WatiN от целевого кода?
Учитывая тот факт, что можно даже получить объект Form, который уже запущен? (Я имею в виду получение ссылки на форму из другого консольного приложения C#, например?)
если так, может кто-нибудь показать мне пример кода?
Я попробовал ниже в отдельном проекте, но ничего не происходит после открытия Form1. Потому что процесс останавливается на Application.Run(myform)
var t = new Thread(() =>
{
Form1 myform = new Form1();
Application.Run(myform);
myform.textBox1.Text = "really";
Settings.AutoStartDialogWatcher = false;
var ie = new IE(myform.webBrowser1.ActiveXInstance);
ie.GoTo("http://www.google.com");
ie.TextField(Find.ByClass("lst")).TypeText("this is awesome!!");
ie.Button(Find.ByName("btnG")).Click();
});
t.SetApartmentState(ApartmentState.STA);
t.Start();
1 ответ
Прежде всего, вы действительно дублируете свой недавний вопрос.
Я часто использую WatiN, но для автоматизации браузера, а не для тестов, но я действительно не знаю, почему вы не можете использовать WatiN в своих тестах напрямую. Почему у вас не может быть тестового проекта с кодом WatiN? Кроме того, у меня действительно есть ощущение, что вам нужно больше изучать C#. Вы уже говорили ранее, что вы используете C# на пару дней.
Как ответ на ваш вопрос, вы не можете иметь ссылку на объекты, которые вы создали в отдельных процессах (.NET - в отдельном домене приложений). Вы не можете сделать что-то, как вы хотели сделать в предыдущем вопросе, а именно:
System.Diagnostics.Process Proc = new System.Diagnostics.Process();
Proc.StartInfo.FileName = "path_to_exe\\winformWithWebBrowserTest.exe";
Proc.Start();
WindowsFormsApplication1.Form1 form1 = new Form1();
С этим кодом вы находитесь в процессе A:
- Начиная процесс Б.
- Создание объекта типа
Form1
в процессе А.
Между процессом A и B. нет никакой связи, связи или чего-либо еще. Вы не можете просто создать объект или вызвать метод или что-то еще в процессе A, который находится в проекте B. Если вам нужно это сделать, вы должны зайти в Goo gle для "interprocess". общение в C#". В эти дни вы можете добавить "WCF" к вашим критериям поиска. Например, посмотрите на этот вопрос: Межпроцессное взаимодействие для Windows в C# (.NET 2.0) или Каков лучший выбор для межпроцессного взаимодействия.NET?, Но на самом деле все не так просто, как вы хотите. По сути, это все равно что сделать процесс B сервером / хостом, а процесс A - клиентом.
РЕДАКТИРОВАТЬ после ОП комментария
Если вы хотите автоматизировать только управление через веб-браузер, это можно сделать без особых усилий. Вы можете попробовать что-то вроде этого:
var p = Process.Start(@"path_to_exe");
Thread.Sleep(1000); //Need to wait a while for that process to start,
//and web browser control to initialize
//Use IEUtils from WatiN library
//We need to find a handle to window containing web browser control
//Maybe you will have to do some other stuff to find that window and I can't
//guarantee this will work instantly, because internally this method is enumerating
//controls on form to find web browser control
var htmlDocument = IEUtils.IEDOMFromhWnd(p.MainWindowHandle);
//Copy from WatiN class - ShellWindows2
var SID_SWebBrowserApp = new Guid(0x0002DF05, 0x0000, 0x0000, 0xC0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x46);
var serviceProvider = htmlDocument as WatiN.Core.Native.Windows.IServiceProvider;
object objIWebBrowser;
var guidIWebBrowser = typeof(IWebBrowser2).GUID;
serviceProvider.QueryService(ref SID_SWebBrowserApp, ref guidIWebBrowser, out objIWebBrowser);
//Stopping dialog watcher is essential
Settings.AutoStartDialogWatcher = false;
var ie = new IE(objIWebBrowser);
ie.GoTo(@"http://www.google.com");
Если вам нужно использовать средство просмотра диалогов, вы можете переписать код из моего ответа на другой вопрос.