2016-09-27 63 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]