与:How to use watin with WebBrowser control?
相关所以,我在这里阅读了讨论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);
但这也不起作用,整个事情都悬而未决。在没有锁定UI线程的情况下等待这个衍生线程的最佳方法是什么,并在完成后进入下一个操作?
答案 0 :(得分:0)
脚本错误尚未被禁用。
webBrowser.ScriptErrorsSuppressed = true
进一步,尝试从稳定的代码开始:
public void SearchForWatiNOnGoogle()
{
using (var browser = new IE("http://www.google.com"))
{
browser.TextField(Find.ByName("q")).TypeText("WatiN");
browser.Button(Find.ByName("btnG")).Click();
Assert.IsTrue(browser.ContainsText("WatiN"));
}
}