WatiN с .NET WebBrowser Control - PullRequest
       30

WatiN с .NET WebBrowser Control

1 голос
/ 05 августа 2011

относится к: Как использовать 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); 

но это тоже не работает, все зависает. Каков наилучший способ ожидания этого порожденного потока без блокировки потока пользовательского интерфейса и перехода к следующей операции после ее завершения?

1 Ответ

0 голосов
/ 07 февраля 2014

Ошибка скрипта не отключена.

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