2010-02-28 13 views
13

Próbuję zautomatyzować w WinForm przy użyciu formantu WebBrowser, aby nawigować i wyciągać informacje z raportu z witryny. Możesz wprowadzać wartości w polach tekstowych i wywoływać zdarzenia klikania dla przycisków i łączy, ale nie mam pojęcia, jak wybrać rozwijaną opcję .... w sposób zautomatyzowany. Ktoś polecić jak wybrać pozycję z listy rozwijanej, biorąc pod uwagę ten przykład HTML:Kontrola WebBrowser HTMLDocument automatyzuje wybór rozwijanej opcji

<SELECT id="term_id" size="1" name="p_term_in"><option value="">Select Another Term<option value="201050">Summer 2010<option value="201010">Spring 2010<option value="200980">Fall 2009</SELECT> 

Dla innych, że mogą uczyć się od wprowadzania wartości do pól tekstowych i wywoływanie zdarzeń kliknięcia oto jak to zrobić:

webBrowser1.Document.GetElementById("<HTML ELEMENT NAME>").SetAttribute("value", "THE NAME"); 

Wywołanie przycisk lub hiperłącze kliknij:

webBrowser1.Document.GetElementById("<BUTTON>").InvokeMember("click"); 

Tak już rozwiązane wartości Wprowadzanie i wywoływanie kliknięcie, ale nie rozwiązali wybierając wartość rozwijanej.

Odpowiedz

16

Zakładając, że następujące select w HTML:

<select id="term_id" size="1" name="p_term_in"> 
    <option value="">Select Another Term 
    <option value="201050">Summer 2010 
    <option value="201010">Spring 2010 
    <option value="200980">Fall 2009 
</select> 

To powinno pozwolić na wybierz wstępnie trzecią wartość:

webBrowser1.Document.GetElementById("term_id").SetAttribute("value", "201010"); 
+4

Sorry , to nie działa, ponieważ element 'select' nie ma atrybutu" value ".Po prostu przetestowałem ... – AxelEckenberger

5

Musisz wybrać atrybut selected dla wybranej opcji.

Dane:

<select id="mySelect"> 
    <option>1</option> 
    <option>2</option> 
    <option>3</option> 
</select> 

Poniższa byłoby selct trzecią opcję:

webBrowser1.Document 
      .GetElementById("") 
      .Children.GetElementsByName("option")[2] 
      .SetAttribute("selected", "selected"); 
4

spróbuj tego:

dodać odniesienie do microsoft.mshtml w projekcie -> Add Reference ...

Dim cboTemp As mshtml.HTMLSelectElement 
    cboTemp = WebBrowser1.Document.GetElementById("myselect").DomElement 
    cbotemp.selectedindex = 2 

o zmiennej cbotemp ustawiony na wybranej elementu daje większy dostęp do kontrola :)

3
HtmlElement hField = webBrowser1.Document.GetElementById("ID"); 
hField.SetAttribute("selectedIndex", "2"); 

Selekcja według indeksu (zera oparty) nie wartość ....

6
var select = webBrowser.Document.GetElementById("ddlProyectos"); 

mshtml.HTMLSelectElement cbProyectos = select.DomElement as mshtml.HTMLSelectElement; 

var total = cbProyectos.length; 
for (var i= 0; i < total; i++) 
{ 
    cbProyectos.selectedIndex = i; 
    if (cbProyectos.value.Contains("13963")) 
    { 
     break; 
    } 

} 
//cbProyectos.selectedIndex = 4; 
select.InvokeMember("onchange"); 

select.Children[4].SetAttribute("selected", "selected"); 

var theElementCollection = webBrowser.Document.GetElementsByTagName("select"); 
foreach (HtmlElement el in theElementCollection) 
{ 
    if (el.GetAttribute("value").Equals("13963")) 
    { 
     el.SetAttribute("selected", "selected"); 
     //el.InvokeMember("click"); 
    } 
} 
+0

Twoja sugestia działa tak, że opcja zostaje wybrana poprawnie (widzę ją zaznaczoną). Jednak skrypt powiązany z tą opcją nie działa. Po ręcznym wybraniu tej opcji skrypt działa poprawnie. Czy masz jakiś pomysł, dlaczego? Jak to naprawić? – newman

2

Można to wykorzystać:

webBrowser1.Document.GetElementById("term_id").SetAttribute("value",yourText); 
3

ja odpowiadając na to stanowisko po upływie pięciu lat, dla ludzi, którzy szukają roztwór ten problem.

Jeśli wystarczy złożyć/dodawać wartość dla rozwijanej następnie linia ta jest wystarczająca:

webBrowser1.Document.GetElementById("term_id").SetAttribute("value", "200980"); 

Ale jeśli naprawdę potrzebujesz, aby wybrać podstawową opcję, a następnie:

HtmlElement selectDom = webBrowser1.Document.GetElementById("term_id"); 
foreach (HtmlElement option in selectDom.GetElementsByTagName("option")) 
{ 
    if (option.GetAttribute("value") == "200980") 
    { 
     var dom = option.DomElement as dynamic; 
     dom.selected = true; 
     // selectDom.InvokeMember("onChange"); // if you need this too 
     break; 
    } 
} 
Powiązane problemy