2016-09-27 64 views
1

我試圖找到一個無序的菜單列表上的兩個輸入字段,但硒是無法找到他們。到目前爲止,我已經試圖通過XPath和類名稱和順序標識定位子中的硒(Python)的孩子

("//input[@class=x-form-text x-form-field][4]") 

找到他們,但它要麼不定位的元素,或者說,它的格式不正確。我得到的唯一成功是如果我使用id,但每次頁面加載時,結尾的數字都會發生變化。

有沒有辦法把它定位在菜單列表,然後將列表項,然後輸入字段?我完全難住。

事項有關菜單列表:它基於分辨率改變大小,如果它變得更小的向下箭頭圖標將出現,除非選擇了向下按鈕對列表底部的字段將消失。

下面是HTML的例子:

<ul id="ext-gen406" class="x-menu-list"> 
    <li id="ext-comp-1237" class="list-item "> 
    <li id="ext-comp-1238" class="list-item "> 
    <li id="ext-comp-1239" class="list-item "> 
    <li id="ext-comp-1240" class="list-item "> 
    <li id="ext-comp-1241" class="list-item "> 
    <li id="ext-comp-1242" class="list-item "> 
    <li id="ext-comp-1207" class="list-item sep-li"> 
    <li id="ext-comp-1243" class="list-item "> 
    <li id="ext-comp-1244" class="list-item "> 
    <li id="ext-comp-1208" class="list-item sep-li"> 
    <li id="ext-comp-1245" class="list-item "> 
    <li id="ext-comp-1246" class="list-item "> 
    <li id="ext-comp-1247" class="list-item "> 
     <div class='xtb-text'>Text Field Label</div> 
    <li id="ext-comp-1248" class="list-item "> 
     <div id="ext-gen424" class="x-form-field-wrap x-form-field-trigger-wrap"> 
      <input id="ext-comp-1248" class="x-form-text x-form-field"name="ext-comp-1248" 
     </div> 
    <li id="ext-comp-1249" class="list-item "> 
    <li id="ext-comp-1250" class="list-item "> 
     <div class="x-form-field-wrap x-form-field-trigger-wrap" id="ext-gen426"> 
      <input id="ext-comp-1250" name="ext-comp-1250" class="x-form-text x-form-field" 
     </div>   
    <li id="ext-comp-1251" class="list-item "> 
    <li id="ext-comp-1252" class="list-item "> 
</ul> 
+0

你應該包括在單引號類這樣的值:(「//輸入[@類='X型文本的X形式 - 字段'] [4]「) – lauda

+0

我剛試過它在單引號中,仍然收到此錯誤消息:失敗,異常,消息:無法找到元素://輸入[@ class ='x-form-text x-form 'field'] [4] – tinneko

+0

@tinneko - 您的問題的信息不完整。你能在頁面上有兩個以上的輸入字段嗎?如果是,那麼你如何區分你想要的兩個輸入和你不想要的? – testerjoe2

回答

0

好了,所以......我終於想通了!

這裏是我工作:

driver.find_element_by_xpath("//li/div[contains(text(), 'Text labeling input field')]/../following-sibling::li/div/input") 
0

您可以使用cssSelector來解決這個問題,

driver.find_element_by_css_selector("ul.x-menu-list input.x-form-field:nth-child(1)") //first input box 
driver.find_element_by_css_selector("ul.x-menu-list input.x-form-field:nth-child(2)") //second input box 
+0

請評論投票的理由。 –

+0

我寧願你的方法Sundharsan。如果你有多個具有相同x-menu-list類的ul,那麼我會用wrapping元素(通常是一個div)更新這個路徑。OP沒有提供足夠的信息來使其更加靈活......例如,他們是否需要將輸入字段與特定的列表項關聯起來? –

+0

我試過這種方法,由於某種原因它只能找到第一個輸入字段。它沒有找到列表中的任何其他輸入字段。 (有12個)。有人可以提供更多關於如何使用第n個孩子的信息嗎?也許這是要走的路。 – tinneko

0

這個方法我試過,由於某種原因,只位於第一個輸入領域。它沒有找到列表中的任何其他輸入字段。 (有12個)。有人可以提供更多關於如何使用第n個孩子的信息嗎?

你應該嘗試使用find_elements找到所有input元素,並使用以下指數特定元素上執行某些操作這種情況下: -

all_inputs = driver.find_elements_by_css_selector("ul.x-menu-list > li.list-item input.x-form-text") 

,我試圖給這兩個輸入字段找到此列表中的第9和第10個輸入字段。

#now use index to get desire input element 
if len(all_inputs) >= 10: 
    desire_input_9 = all_inputs[8] 
    desire_input_10 = all_inputs[9]