使用.NET WebBrowser控件进行WatiN

时间:2011-08-05 19:54:00

标签: .net browser controls watin

与: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线程的情况下等待这个衍生线程的最佳方法是什么,并在完成后进入下一个操作?

1 个答案:

答案 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"));
   }
}