2016-10-04 31 views
1

我的需求是识别表格并检查每个选择列表的值,以查找特定问题名称及其对应关系注释值。在外部表格的tr标签中访问两个表格,而外部表格的tr标签又包含表格和其他元素,如选择列表,文本区域

在这里,我发现问题本身被分成两个表格,并且在访问它们时遇到了困难。

我的HTML结构如下所示。

<table class="dataentry"> 
<tbody> 
    <tr> 
     <td width="50%"> 
      <table class="genetichxtable entirewidth"> 
       <tbody> 
        <tr> 
         <th></th> 
         <th>Y/N</th> 
         <th>Notes</th> 
        </tr> 
        <tr> 
         <td>Huntington's Chorea</td> 
         <td class="nowrap"> 
          <select name="GSANS{1}{ANSWERYN}" questionid="1" section="GENETICHX" type="SELECT"> 
           <option value=""></option> 
           <option value="Y">Yes</option> 
           <option value="N">No</option> 
          </select> 
         </td> 
         <td class="nowrap"> 
          <textarea name="GSANS{1}{ANSWERNOTES}" type="TEXTAREA"> 
          </textarea> 
         </td> 
        </tr> 
        <tr> 
         <td>History of Hepatitis</td> 
         <td class="nowrap"> 
          <select name="GSANS{2}{ANSWERYN}" questionid="2" section="GENETICHX" type="SELECT"> 
           <option value=""></option> 
           <option value="Y">Yes</option> 
           <option value="N">No</option> 
          </select> 
         </td> 
         <td class="nowrap"><textarea name="GSANS{2}{ANSWERNOTES}" type="TEXTAREA"></textarea> 
         </td> 
        </tr> 
        <tr> 
         <td>Intellectual Disability/Autism</td> 
         <td class="nowrap"> 
          <select name="GSANS{5}{ANSWERYN}" questionid="5" section="GENETICHX" type="SELECT"> 
           <option value=""></option> 
           <option value="Y">Yes</option> 
           <option value="N">No</option> 
          </select> 
         </td> 
         <td class="nowrap"><textarea name="GSANS{5}{ANSWERNOTES}" type="TEXTAREA"></textarea> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </td> 
     <td width="50%"> 
      <table class="genetichxtable entirewidth"> 
       <tbody> 
        <tr> 
         <th></th> 
         <th>Y/N</th> 
         <th>Notes</th> 
        </tr> 
        <tr> 
         <td>Thalassemia (Italian, Greek, Mediterranean, Or Asian Background): MCV &lt; 80</td> 
         <td class="nowrap"> 
          <select name="GSANS{4}{ANSWERYN}" questionid="4" section="GENETICHX" type="SELECT"> 
           <option value=""></option> 
           <option value="Y">Yes</option> 
           <option value="N">No</option> 
          </select> 
         </td> 
         <td class="nowrap"><textarea name="GSANS{4}{ANSWERNOTES}" type="TEXTAREA"></textarea> 
         </td> 
        </tr> 
        <tr> 
         <td>Congenital Heart Defect</td> 
         <td class="nowrap"> 
          <select name="GSANS{3}{ANSWERYN}" questionid="3" section="GENETICHX" type="SELECT"> 
           <option value=""></option> 
           <option value="Y">Yes</option> 
           <option value="N">No</option> 
          </select> 
         </td> 
         <td class="nowrap"><textarea name="GSANS{3}{ANSWERNOTES}" type="TEXTAREA"></textarea> 
         </td> 
        </tr> 
       </tbody> 
      </table> 
     </td> 
    </tr> 
</tbody> 

我要遍历表,还有从下拉式的select_list中值和输入notes.Is任何方式使用这个自动化的Watir?

回答

1

每个问题都封装在一行中 - tr元素。但是,某些行不是行 - 例如包含2个子表的tr和包含列标题的tr。区分问题行的是包含选择列表(即问题)。

您可以通过选择列表找到里面的行发现的问题行:

outer_tr = browser.table(class: 'dataentry').tr 
questions = outer_tr.trs.select { |tr| tr.select.exists? } 

虽然的Watir般的少,这可以更简洁地使用XPath写着:

questions = browser.trs(xpath: '//table[@class="dataentry"]//tr[./td/select]') 

不管您使用上述方法中的哪一种,您现在在集合中有每个问题行。这使您可以遍历每一行并查找用于相同问题的标题,选择列表和备注字段。在每个问题下面的迭代:

questions.each do |tr| 
    # The data/fields of interest for the row 
    title = tr.td.text 
    select = tr.select 
    notes = tr.textarea 

    # Do stuff with the fields 
    p title 
    select.select('Yes') 
    notes.set('some note') 
end 

如果您想设置一个特定的问题,我认为由标题,您可以通过使用find方法问题进行迭代。这将返回与问题相关的特定行。例如,下面发现与“肝炎史”有关的问题。你可以看到问题的select/textarea是正确的相关字段(即问题2)。

question = questions.find { |q| q.td.text == 'History of Hepatitis' } 
p question.td.text 
#=> "History of Hepatitis" 
p question.select.name 
#=> "GSANS{2}{ANSWERYN}" 
p question.textarea.name 
#=> "GSANS{2}{ANSWERNOTES}" 

请注意,如果您使用的是页面对象gem,则嵌套的元素方法名称是不同的。下面的示例遍历页面对象语法中的每个问题:

outer_tr = table_element(class: 'dataentry').row_element 
questions = outer_tr.row_elements.select { |tr| tr.select_list_element.exists? } 

questions.each do |question| 
    # The data/fields of interest for the row 
    title = question.cell_element.text 
    select = question.select_list_element 
    notes = question.text_area_element 

    # Do stuff with the fields 
    p title 
    select.select('Yes') 
    notes.value = 'some note' 
end 
+0

非常感谢@Justin ko,它的工作正常,对我的要求的修改更少。但在我的框架中使用tr时,它显示** DEPRECATION WARNING ***您正在调用一个名为tr **的方法。后来我将它更改为cell_element,它再次显示trs的弃用警告。 有什么办法摆脱这个? – irs102info

+0

你在使用哪个框架?如果它是页面对象gem,那么'tr'应该用'row_element'替换,'trs'应该用'row_elements'替换。 –

+0

我只使用页面对象gem。当用row_elements替换trs时,我在'Execute'中得到** NoMethodError:未定义的方法'exists?'对于#“,** – irs102info

相关问题