2015-07-02 6 views
5

Disclaimer: Sono nuovo di StackOverflow, almeno in termini di porre le mie domande, quindi se c'è qualcosa di sbagliato o 'cattiva pratica' su questo per favore datemi alcune indicazioni.Selezione selenio Il metodo selectByIndex esamina l'attributo indice anziché il conteggio. Perché?

Recentemente sul lavoro ho avuto motivo di usare Selenium e, essendo nuovo nello strumento, ci sono state alcune volte in cui mi sono grattato il capo per il motivo per cui qualcosa viene fatto in un certo modo. Di solito la ragione diventa evidente in seguito, ma non in questo caso.

Attualmente sto scrivendo un'automazione del browser che prevede l'indicizzazione delle combinazioni di ricerca e l'indicazione del numero di risultati visualizzati per tale combinazione su vari siti correlati alla società per cui lavoro.

Per la maggior parte di questi siti, le ricerche vengono generalmente definite tramite parole chiave e menu a discesa che gestisco tramite l'oggetto Select di Selenium. In particolare, ho utilizzato il metodo selectByIndex per scorrere le varie combinazioni.

Una cosa che ho notato è che, utilizzando questo metodo, più in basso nell'elenco delle opzioni che ho ottenuto più tempo il metodo ha preso. Quando ho aperto la dichiarazione il codice che ho trovato è stato il seguente:

/** 
    * Select the option at the given index. This is done by examing the "index" attribute of an 
    * element, and not merely by counting. 
    * 
    * @param index The option at this index will be selected 
    */ 
    public void selectByIndex(int index) { 
    String match = String.valueOf(index); 

    boolean matched = false; 
    for (WebElement option : getOptions()) { 
     if (match.equals(option.getAttribute("index"))) { 
     setSelected(option); 
     if (!isMultiple()) { 
      return; 
     } 
     matched = true; 
     } 
    } 
    if (!matched) { 
     throw new NoSuchElementException("Cannot locate option with index: " + index); 
    } 
    } 

Cosa Sono confuso circa è il motivo per cui questo codice è scritto in modo tale che esamina l'attributo 'indice'. Per quanto posso dire il metodo getOptions() restituisce un elenco delle opzioni disponibili per il selettore in base al tag, quindi dovrebbe essere accurato, e considerando che ho elencato le combinazioni di ricerca indicizzate utilizzando lo stesso metodo e quelle che sono state preciso sono abbastanza sicuro che lo sia.

Quindi, in questo momento ho esteso la classe e ho sovraccaricato il metodo per dirigerlo direttamente all'indice corrispondente poiché ho un numero non banale di combinazioni di ricerca da controllare e qualsiasi aumento di velocità è prezioso. Non sembrano esserci problemi con il codice sovraccarico e tutto sembra accurato, quindi mi chiedo perché questo metodo sia scritto in questo modo? Qualcuno potrebbe illuminarmi?

+1

Non preoccuparti per il tuo * Disclaimer *; la tua domanda è perfettamente a posto! Inoltre, interessante. Non conosco la risposta, ma potrebbe essere meglio chiedere in https://groups.google.com/forum/#!forum/selenium-developers – SiKing

+0

Puoi eseguire il tuo codice sovraccarico con le opzioni nidificate e vedere se funziona bene . Usa [collegamento] (http://www.w3schools.com/tags/tryit.asp?filename=tryhtml_optgroup) – Manu

risposta

1

Selezionare l'opzione all'indice indicato. Questo viene fatto esaminando l'attributo "indice" di un elemento, e non semplicemente con il conteggio.

Credo che questo sia fatto per superare la possibilità di Nested Options o OPTGROUP nel tag Seleziona Dropdown. Si consideri il sotto Seleziona tag:

<SELECT name="ComOS"> 
    <OPTION selected label="none" value="none">None</OPTION> 
    <OPTGROUP label="PortMaster 3"> 
    <OPTION label="3.7.1" value="pm3_3.7.1">PortMaster 3 with ComOS 3.7.1</OPTION> 
    <OPTION label="3.7" value="pm3_3.7">PortMaster 3 with ComOS 3.7</OPTION> 
    <OPTION label="3.5" value="pm3_3.5">PortMaster 3 with ComOS 3.5</OPTION> 
    </OPTGROUP> 
    <OPTGROUP label="PortMaster 2"> 
    <OPTION label="3.7" value="pm2_3.7">PortMaster 2 with ComOS 3.7</OPTION> 
    <OPTION label="3.5" value="pm2_3.5">PortMaster 2 with ComOS 3.5</OPTION> 
    </OPTGROUP> 
    <OPTGROUP label="IRX"> 
    <OPTION label="3.7R" value="IRX_3.7R">IRX with ComOS 3.7R</OPTION> 
    <OPTION label="3.5R" value="IRX_3.5R">IRX with ComOS 3.5R</OPTION> 
    </OPTGROUP> 
</SELECT> 

In questo Select tag, semplicemente contando l'indice e trovare l'elemento non è sufficiente in quanto potrebbe tornare più indici e dare degli errori/eccezioni.

Inoltre, se vengono trovati più tag di opzione, deve essere notificato anche. Quindi, "probabilmente" questa potrebbe essere la ragione per esaminare l'attributo "index" prima di restituire effettivamente l'elemento.

Nel tuo caso, è meglio sovraccaricare il metodo e andare con gli indici come selectByIndex è destinato a rallentare per una quantità enorme di tag di opzioni.

Modifica:

Modifica dopo aver letto i commenti. La dichiarazione for (WebElement option : getOptions()) sta effettivamente rallentando il codice (la domanda si concentra principalmente sull'aumento della velocità). Quindi, non importa se le soluzioni vengono eseguite esaminando l'attributo indice o in un altro modo in quanto non è questo il motivo della bassa velocità.

Inoltre, l'esame dell'attributo indice è utile per le opzioni nidificate poiché indicizza le opzioni come figlio di Seleziona e non solo come figlio immediato di Seleziona.

+0

Lo hai testato. Sei sicuro di averlo provato e funziona bene con il metodo che op ha chiesto – Madhan

+0

@ Madhan Che cosa hai provato che funziona bene? Op ha chiesto il motivo per cui il metodo potrebbe essere stato scritto in questo modo – Manu

+0

* trovare l'elemento non è sufficiente in quanto potrebbe restituire più indici e dare errori/eccezioni. * Come si dice – Madhan