2016-05-04 10 views
0

Der vollständige HTML-Code für die Tabelle ist wie folgt:Wie klickt man einen Dropdown-Pfeil in extJS mit Python und Selen?

<table id="clearablecombo-1497" class="x-field clearableCombo x-form-item x-field-default x-anchor-form-item" cellpadding="0" style="table-layout: fixed; width: 287px;"> 
 
<tbody> 
 
<tr id="clearablecombo-1497-inputRow"> 
 
<td id="clearablecombo-1497-labelCell" class="x-field-label-cell" width="105" valign="top" halign="right" style=""> 
 
<label id="clearablecombo-1497-labelEl" class="x-form-item-label x-form-item-label-right" style="width:100px;margin-right:5px;" for="clearablecombo-1497-inputEl">Document Status:</label> 
 
</td> 
 
<td id="clearablecombo-1497-bodyEl" class="x-form-item-body x-form-trigger-wrap-focus" colspan="2" role="presentation" style="width: 100%;"> 
 
<table id="clearablecombo-1497-triggerWrap" class="x-form-trigger-wrap" cellspacing="0" cellpadding="0" style="width: 100%; table-layout: fixed;"> 
 
<tbody> 
 
<tr> 
 
<td id="clearablecombo-1497-inputCell" class="x-form-trigger-input-cell" style="width: 100%;"> 
 
<div id="ext-gen1890" class="x-hide-display x-form-data-hidden" role="presentation"/> 
 
<input id="clearablecombo-1497-inputEl" class="x-form-field x-form-text x-form-focus x-field-form-focus x-field-default-form-focus" type="text" style="width: 100%; text-transform: uppercase; -moz-user-select: text;" name="documentStatus" autocomplete="off" aria-invalid="false"/> 
 
</td> 
 
<td id="ext-gen1888" class="x-trigger-cell" valign="top" style="width:26px"> 
 
<div id="ext-gen1886" class="x-trigger-index-0 x-form-trigger x-form-arrow-trigger x-unselectable x-form-trigger-over x-form-arrow-trigger-over" role="button" style="-moz-user-select: none;"/> 
 
</td> 
 
<td id="ext-gen1889" class="x-trigger-cell" valign="top" style="width:26px"> 
 
<div id="ext-gen1887" class="x-trigger-index-1 x-form-trigger x-form-clear-trigger x-form-trigger-last x-unselectable" role="button" style="-moz-user-select: none;"/> 
 
</td> 
 
</tr> 
 
</tbody> 
 
</table> 
 
</td> 
 
<td id="clearablecombo-1497-errorEl" class="x-form-error-msg x-external-error-icon x-form-invalid-icon" width="0" style="display:none" data-errorqtip=""/> 
 
</tr> 
 
</tbody> 
 
</table>
Der Teil des HTML dieser Teil zu manipulieren, ich bin versucht, ist speziell:

<div id="ext-gen1886" class="x-trigger-index-0 x-form-trigger x-form-arrow-trigger x-unselectable x-form-trigger-over x-form-arrow-trigger-over" role="button" style="-moz-user-select: none;"/>
Die über dem Teil ist der eigentliche Dropdown-Pfeil, der auch in dem obigen großen Teil des HTML ist. Der Dropdown-Text, den ich auswählen muss, lautet "Abgelehnt". Der HTML-Code mit den Auswahlmöglichkeiten sind wie folgt:

<div id="boundlist-1558" class="x-boundlist x-boundlist-floating x-layer x-boundlist-default" tabindex="-1" style="left: 136px; top: 346px; height: auto; z-index: 19001; width: 182px;"> 
 
<div id="boundlist-1558-listEl" class="x-boundlist-list-ct" style="overflow: auto; height: auto;"> 
 
<ul> 
 
<li class="x-boundlist-item x-boundlist-item-over" role="option">All</li> 
 
<li class="x-boundlist-item" role="option">Waiting QA</li> 
 
<li class="x-boundlist-item" role="option">AutoTec Approved</li> 
 
<li class="x-boundlist-item" role="option">User Approved</li> 
 
<li class="x-boundlist-item" role="option">Rejected</li> 
 
<li class="x-boundlist-item" role="option">Deleted</li> 
 
</ul> 
 
</div> 
 
</div>
jemand irgendwelche Vorschläge der XPath habe ich verwenden würde, dies zu tun? Ich habe versucht, den Text wie eine Textbox einzugeben, aber es gibt bestimmte Felder wie Land und Staat, die ausgewählt werden müssen, um sich gegenseitig zu aktivieren.

+0

wo ist dein Code? zeigen, was haben Sie versucht, so weit – Andersson

+0

'def set_dealerSearchDocumentsStatus (self, dealerSearchDocumentsStatus): webDocumentsStatus = WebDriverWait (self.driver, 10) .bis ( ec.element_to_be_clickable ((By.NAME, NM.DP_DEALER_SEARCH_DOCUMENTS_STATUS))) webDocumentsStatus. send_keys (dealerSearchDocumentsStatus) sleep (0.25) webDocumentsStatus.send_keys (Keys.TAB) ' Dies funktioniert für die Eingabe des Textes in das Feld, als ob es ein Textfeld ist. Ich hatte jedoch kein Glück, den Dropdown-Pfeil auszuwählen und den Wert von dort auszuwählen. –

+0

Mein Problem ist natürlich unsere Anwendung wird mit Sencha geschrieben. Die Generierung der IDs ist der Grund, warum ich gezwungen bin, komplexe XPath-Anweisungen zu verwenden. –

Antwort

0

I 'Rolle' denken, ist die beste attr in diesem Fall die Elemente zu finden:

--this one select your desired element 
"//div[contains(id, 'ext-gen')][@role='button'][contains(@class, 'x-form-trigger-over')]" 

--this one select your desired option 
"//li[@role='option'][text()='Rejected']" 
+0

Mit dem Element XPath, wird es nicht alle Dropdowns auf der Seite auswählen? Passen sie technisch nicht alle zu diesem XPath? Muss ich Indexierung verwenden? –

+0

Wenn die Elemente von xpath mit zwei oder mehr Dropdown-Elementen übereinstimmen, können Sie den Index im Basis-Tag verwenden. Beispiel: Wenn es 3 Tabellen wie diese gibt, können Sie den Index im Tag der Tabelle verwenden und Ihren Xpath normal schreiben. Wenn Sie den Namen (in Text) des gewünschten Elements kennen und angezeigt wird, können Sie auch zu ihm navigieren, auch wenn Sie ein anderes Tag verwenden. In XPath können Sie beide einen Text innerhalb des Selektors vergleichen, wie Sie das Elternelement erhalten können. –

+0

Ich denke, wir sind auf der gleichen Seite, aber um klar zu sein, können Sie mir ein Beispiel geben. Ich würde das wirklich zu schätzen wissen. –

0

Als ich das sind die Zielelemente verstehen:

xpath = '//div[contains(id, "ext-gen")][@class="x-trigger-index-0 x-form-trigger x-form-arrow-trigger x-unselectable x-form-trigger-over x-form-arrow-trigger-over"]' 
drop_down = self.driver.find_element_by_xpath(xpath) 
drop_down.click() 
xpath = '//li[@class="x-boundlist-item"][contains(text(), "Rejected")]' 
option = self.driver.find_element_by_xpath(xpath) 
option.click() 
+0

Vielen Dank für Ihre Antwort. Wenn es mehrere Dropdown-Listen gibt, die dieselben Attribute haben, was wird der Fall sein, wird dieser XPath nicht alle auswählen? Muss ich Indexierung verwenden? Das kann der einzige Weg sein. –

+0

'XPath' könnte spezifischer sein, um nur dem erforderlichen Element zu entsprechen. Indizierung ist auch eine akzeptierbare Methode – Andersson

Verwandte Themen