Finding the child of a parent's sibling elemen

2019-09-14 19:32发布

The scenario that I am looking at is that we have a table with multiple columns. One of those columns has a name, another has a dropdown list. I need to manipulate the dropdown for a row that contains a particular name. I looked at the source output, and tried getting the element's grandparent (the table row) so that I could search for the list. However, there was no such search functionality when I used the parent object.

It seems like there would be a lot of this kind of scenario in automating/testing a site, but I have not found anything after searching for a couple of hours. Any help would be appreciated.

EDIT: The application in question is an ASP.NET, and the output HTML is gnarly at best. However, here is a cleaned up example of what the HTML being searched looks like:

<table class="myGrid" cellspacing="0" cellpadding="3" rules="all" border="1" id="ctl00_content_MyRpt_ctl01_MyGrid" style="border-collapse:collapse;">
  <tr align="left" style="color:Black;background-color:#DFDBDB;">
    <th scope="col">Name</th><th scope="col">Unit</th><th scope="col">Status</th><th scope="col">Action</th>
  </tr>
  <tr>
    <td>
      <span id="ctl00_content_MyRpt_ctl01_MyGrid_ctl02_Name">JOHN DOE</span>
    </td>
    <td>
      <span id="ctl00_content_MyRpt_ctl01_MyGrid_ctl02_UnitType">Region</span>&nbsp;
      <span id="ctl00_content_MyRpt_ctl01_MyGrid_ctl02_UnitNum">1</span> 
    </td>
    <td>
      <span id="ctl00_content_MyRpt_ctl01_MyGrid_ctl02_Status">Complete</span>                                   
    </td>
    <td class="dropdown">                                                          
      <select name="ctl00$content$MyRpt$ctl01$MyGrid$ctl02$ActionDropDown" onchange="javascript:setTimeout(&#39;__doPostBack(\&#39;ctl00$content$MyRpt$ctl01$MyGrid$ctl02$ActionDropDown\&#39;,\&#39;\&#39;)&#39;, 0)" id="ctl00_content_MyRpt_ctl01_MyGrid_ctl02_ActionDropDown" class="dropdown">
        <option value="123456">I want to...</option>
        <option value="Details.aspx">View Details</option>
        <option value="Summary.aspx">View Summary</option>
        <option value="DirectReports.aspx">View Direct Reports</option>
      </select>
    </td>
  </tr>
  <tr>
    ...
  </tr>
</table>

1条回答
别忘想泡老子
2楼-- · 2019-09-14 19:57

I found a way to do what I wanted. It is probably not the best or most elegant solution, but it works (it is not production code).

    private void btnStart_Click(object sender, EventArgs e)
    {
        using (var browser = new IE("http://godev/review"))
        {
            browser.Link(Find.ByText("My Direct Reports")).Click();
            TableRow tr = browser.Span(Find.ByText("JOHN DOE")).Parent.Parent as TableRow;
            SelectList objSL = null;
            if (tr.Exists)
            {
                foreach (var td in tr.TableCells)
                {
                    objSL = td.ChildOfType<SelectList>(Find.Any) as SelectList;
                    if (objSL.Exists) break;
                }
                if (objSL != null && objSL.Exists)
                {
                    Option o = objSL.Option(Find.ByText("View Direct Reports"));
                    if (o.Exists) o.Select();
                }
            }
        }
    }

Hopefully this saves someone a little time and effort. Also, I would love to see if someone has a better solution.

查看更多
登录 后发表回答