Avatar billede telep Nybegynder
23. januar 2006 - 10:11 Der er 11 kommentarer og
1 løsning

WebBrowser komponent - vent til siden er loadet

Hej,

Jeg står med et problem jeg simpelthen ikke kan løse (det er garanteret mega nemt - men jeg har set mig helt blind på det...).

Jeg har en webbrowser komponent på en form.
Jeg klikker på en knap, hvorefter der bliver navigeret til en URL.
Efter jeg har sagt axWebBrowser1.Navigate2(ref objURL), vil jeg gerne vente på at html'en kan læses.

string userCreateURL = serverURL;
objURL = (Object)userCreateURL;
searchHTML = true;
axWebBrowser1.Navigate2(ref objURL);

//HER VENT PÅ AT HTML'en FOR SIDEN ER LOADET

//NÅR HTML-siden ER INDLÆST SKAL FØLGENDE KØRES:

            mshtml.IHTMLDocument2 doc = axWebBrowser1.Document as mshtml.IHTMLDocument2;
            string source = ((mshtml.HTMLDocumentClass)(doc)).documentElement.outerHTML;

            string pattern = @"INPUT type=hidden value=(?<uid>\d+) name=uid";
            Match m = Regex.Match(source, pattern);
       
            if(m.Success)
            {
                return(m.Groups["uid"].ToString());
            }
            return ("fail");


Sammenfatning:
Jeg har en funktion der skal returnere en værdi, der findes i et html-dokument. En webbrowser komponent vil navigere til den relevante url - hvorefter der skal ventes på at html'en for siden kan læses.



Mvh
Telep
Avatar billede sovsekoder Nybegynder
23. januar 2006 - 10:35 #1
m_AxWebBrowser = axWebBrowser;
m_AxWebBrowser.DocumentComplete += new AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEventHandler(this.WebBrowser_DocumentComplete);

private void WebBrowser_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
  IHTMLDocument2 doc = m_AxWebBrowser.Document as IHTMLDocument2;
  string str = doc.readyState;
  Debug.WriteLine("WebBrowser_DocumentComplete start webbrowser readystate = " + str);
  if(str == "complete")
  {
    // Her er siden indlæst 
  }
}
Avatar billede sovsekoder Nybegynder
23. januar 2006 - 10:36 #2
så i "grove" træk er din plan:
1) aboner på DocumentCompleteEventHandler
2) i denne handler tester du om dokumentet's readyState er "complete"

Når dette er gjort ved du at dokumentet er loaded færdigt.
Avatar billede telep Nybegynder
23. januar 2006 - 10:48 #3
hmmm... går ikke helt...

Følgende funktion skal returnere en variabel fra HTML-dokumentet.

        public string createUser(string username, string password)
        {   
            string userCreateURL = serverURL + "/gate?bean=sipadmin.web.SvUsersEdit&operation=new&username=" +
                username + "&password=" + password + "&password2=" + password + "&longname=" + username + "&email=" +
                username + "@" + username + ".com&uid=0&desc=" + username;

            objURL = (Object)userCreateURL;
            searchHTML = true;
            axWebBrowser1.Navigate2(ref objURL);
        }       


I min event DocumentComplete har jeg følgende:

        private void axWebBrowser1_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
        {
            if (searchHTML)
            {
                mshtml.IHTMLDocument2 doc = axWebBrowser1.Document as mshtml.IHTMLDocument2;
                string str = doc.readyState;
                if(str == "complete")   
                    foundUID = findUID();
                searchHTML = false;
            }
        }

Funktionen createUser skal returnere foundUID - som altså først kan findes når html siden er loadet
Avatar billede telep Nybegynder
23. januar 2006 - 11:40 #4
any clues?
Avatar billede segato Nybegynder
23. januar 2006 - 12:59 #5
Det er rigtigt hvad han skriver efter din navigate gør du følgende (har ikke vs her så det er pseudu kode:

browser.Navigate(someUrl);
while( doc.readyState != Kan ik huske namespace.Complete )
Application.DoEvents();
Avatar billede segato Nybegynder
23. januar 2006 - 13:00 #6
Btw hvis du har mulighed for det så anvendt framework 2.0 det er rigtig meget nemmere at arbejde med. Her er det hele wrappet til Forms namespacet :D
Avatar billede sovsekoder Nybegynder
23. januar 2006 - 13:08 #7
telep 10:48:17,

>hmmm... går ikke helt...
Kan du sige hvorfor ? hvad er det der ikke virker ?

Du skal være opmærksom på at DocumentComplete eventet fyres flere gange... så du skal kun køre din "document complete" kode inde i If sætningen:
private void WebBrowser_DocumentComplete(object sender, AxSHDocVw.DWebBrowserEvents2_DocumentCompleteEvent e)
{
  IHTMLDocument2 doc = m_AxWebBrowser.Document as IHTMLDocument2;
  string str = doc.readyState;
  Debug.WriteLine("WebBrowser_DocumentComplete start webbrowser readystate = " + str);
  if(str == "complete")
  {
      if (searchHTML)
            {
                foundUID = findUID();
                searchHTML = false;
            }

  }
}
Avatar billede sovsekoder Nybegynder
23. januar 2006 - 13:09 #8
det jeg mente var at DocumentComplete eventet fyres uden at det nødvendigvis betyder at hele dokumentet er færdig loadet. Du kan kun være helt sikker når doc.readyState == "complete"
Avatar billede telep Nybegynder
23. januar 2006 - 22:43 #9
tid til svar!
Avatar billede sovsekoder Nybegynder
24. januar 2006 - 13:51 #10
.svar.
Avatar billede sovsekoder Nybegynder
24. januar 2006 - 13:52 #11
og det kom til at virke ?
Avatar billede telep Nybegynder
24. januar 2006 - 14:46 #12
både og...
trækker lidt meget processorkraft... men hva' fa'en...
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
IT-kurser om Microsoft 365, sikkerhed, personlig vækst, udvikling, digital markedsføring, grafisk design, SAP og forretningsanalyse.

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester