относится к: Как использовать watin с контролем WebBrowser?
Итак, я прочитал соответствующий раздел, в котором обсуждается модель STA:
http://watin.org/documentation/sta-apartmentstate/
Теперь вопрос, как вы справляетесь с этим?
Я создал метод для навигации:
public void NavigateTo(object browser, string url)
{
var t = new Thread(() =>
{
Settings.AutoStartDialogWatcher = false;
browserInstance = new IE(browser);
browserInstance.GoTo(url);
} );
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
Я вызываю это, передавая свой экземпляр ActiveX браузера:
driver.NavigateTo(webBrowser1.ActiveXInstance, "http://www.google.com");
Теперь я пытаюсь войти на целевой сайт:
public void OpenSiteAndLogin(object browser)
{
if (_Log.IsDebugEnabled) _Log.DebugFormat("Open Site and Login");
var t = new Thread(() =>
{
Settings.AutoStartDialogWatcher = false;
//browserInstance = new IE(browser);
//browserInstance.GoTo(baseURL);
using (var browserInstance = new IE(browser))
{
try
{
if (_Log.IsDebugEnabled) _Log.DebugFormat("Looking for Account Element");
TextField account = browserInstance.TextField(Find.ByClass("account-link"));
if (_Log.IsDebugEnabled) _Log.DebugFormat("Logged In");
loggedIn = true;
}
catch (Exception)
{
if (_Log.IsDebugEnabled) _Log.DebugFormat("Not found, not logged in");
}
if (!loggedIn)
{
if (_Log.IsDebugEnabled) _Log.DebugFormat("not logged in, click login");
Element login = browserInstance.Element(Find.ByText("Login"));
login.Click();
if (_Log.IsDebugEnabled) _Log.DebugFormat("fill in login info");
browserInstance.TextField(Find.ById("id_auth-username")).TypeText("test");
browserInstance.TextField(Find.ById("id_auth-password")).TypeText("test");
browserInstance.Element(Find.BySelector("input[type=submit]")).Click();
if (_Log.IsDebugEnabled) _Log.DebugFormat("submit login info");
if (_Log.IsDebugEnabled) _Log.DebugFormat("wait for account element");
browserInstance.WaitForComplete();
if (_Log.IsDebugEnabled) _Log.DebugFormat("Logged In");
loggedIn = true;
}
}
}
);
t.SetApartmentState(ApartmentState.STA);
t.Start();
}
}
Итак, я пытаюсь нажать кнопку, чтобы сделать это:
WebDriver driver = new WebDriver();
driver.NavigateTo webBrowser1.ActiveXInstance, "http://www.google.com");
driver.OpenSiteAndLogin(webBrowser1.ActiveXInstance);
Я пробовал что-то вроде этого:
WebDriver driver = new WebDriver();
driver.NavigateTo(webBrowser1.ActiveXInstance, "http://www.google.com");
Application.DoEvents();
Thread.Sleep(5000);
driver.OpenSiteAndLogin(webBrowser1.ActiveXInstance);
но это тоже не работает, все зависает. Каков наилучший способ ожидания этого порожденного потока без блокировки потока пользовательского интерфейса и перехода к следующей операции после ее завершения?