2010-02-28 12 views
13

Estoy intentando automatizar en un WinForm usando un control WebBrowser para navegar y extraer información del informe de un sitio web. Puede introducir valores en cuadros de texto e invocar los eventos de clic para botones y enlaces, pero no he descubierto cómo seleccionar un menú desplegable de opciones .... de forma automática. Alguien recomienda cómo seleccionar un elemento de una lista desplegable, teniendo en cuenta este ejemplo html:Control WebBrowser HTMLDocument automatizar el menú desplegable de la opción de selección

<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> 

Para otros que pueden aprender de introducir los valores en los cuadros de texto e invocando eventos click aquí es cómo se hace:

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

botón o hipervínculo invocación clic:

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

valores Así que he resuelto que entran y la invocación de clic, pero no he resuelto seleccionando un valor desplegable.

Respuesta

16

Suponiendo que haya la siguiente selección en el código 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> 

esto debería permitir a preseleccione el tercer valor:

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

este momento , esto no funciona ya que el elemento 'select' no tiene un atributo' value'.Acabo de probarlo ... – AxelEckenberger

5

Deberá seleccionar el atributo selected en la opción que desee.

dado:

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

lo siguiente sería seleccionar destino la tercera opción:

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

intente esto:

añadir una referencia a Microsoft.mshtml en el proyecto -> añadir referencia ...

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

tener la cbotemp set variable a un elemento de selección le da un mayor acceso a la de control :)

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

Selección por índice (cero basan) no el valor ....

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

Su sugerencia es que la opción se selecciona correctamente (puedo verla seleccionada). Sin embargo, el script asociado con la opción no parece ejecutarse. Cuando seleccioné manualmente esta opción después, la secuencia de comandos se ejecuta correctamente. ¿Tienes alguna idea de por qué? ¿Como arreglarlo? – newman

2

Se puede utilizar esta:

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

Estoy respondiendo a esta entrada después de cinco años, para las personas que están buscando una solución de este problema.

Si sólo tiene que enviar/publicar un valor para el menú desplegable a continuación, esta línea es suficiente:

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

Pero si realmente se necesita para seleccionar una opción subyacente, entonces:

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; 
    } 
} 
Cuestiones relacionadas