首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C# / ATATA / Selenium:使用ControlList存储多个表

C# / ATATA / Selenium:使用ControlList存储多个表
EN

Stack Overflow用户
提问于 2018-06-08 22:39:46
回答 1查看 503关注 0票数 1

我正在为我的公司编写一个Page对象,它代表一个HTML页面,其中包含许多表(而且结构很糟糕)。我只对这个页面上的某些表感兴趣,为了简单起见,我希望在page对象上有一个表来引用。

问题

  1. 此页面是动态的,并加载各种数量的表。
  2. 在HTML中,单个工作流的“显示表”被分成3个表。
    1. 表1包含唯一标识符。
    2. 表2包含了我不关心的按钮。
    3. 表3(包装在div中)包含我需要检索的实际表数据。

  1. 表不以任何方式组织、分组或嵌套。
    1. 只有组织是“显示表”的重复平面结构。结构不变(从ASP.Net生成)

目标

  1. 有一个ControlList来表示每个“显示的表”。
  2. 坚持使用ATATA (我有一个Selenium解决方案,但是我们的Page对象大多数使用ATATA,不想偏离)
  3. 将工作流的名称作为变量存储在每个表对象上(WorkflowName变量)

下面是我正在使用的HTML代码的抽象。

代码语言:javascript
复制
<div>
  <table> <!-- Start of Displayed Table. Shows as a single row header -->
    <tbody>
      <tr>
        <td>
          <h2 id='WorkflowHeader'> Workflow Identifier </h2>
        </td>
      </tr>
    </tbody>
  </table>
  <table> 
    <!-- This table contains buttons that I am not concerned with -->
  </table>
  <div>
    <table> <!-- Start of multi row table that contains data to be retrieved -->
      <tr>
        <td>Value I want in a table</td>
        <td>Value I want in a table</td>
      </tr>
    </table>
  <br /> <!-- End of "Displayed Table" -->
  <!-- The above structure repeats for every Workflow type. basic structure below -->
  <table></table>
  <table></table>
  <div>
    <table></table>
  </div>
  <br />
  <!-- Basic repeating table structure above -->
</div>

在我的ATATA Page对象中,我有以下内容:

代码语言:javascript
复制
using Atata;
using _ = ProjectNameSpace.WorkflowPageObject;

namespace ProjectNameSpace
{
    public class WorkflowPageObject : Page<_>
    {    
        public ControlList<WorkflowTable, _> WorkflowTables { get; private set; }

        [ControlDefinition("h2[contains(@id, 'WorkflowHeader')]/../../../../following-sibling::div/table", ComponentTypeName = "table")]
        public class WorkflowTable: Table<WorkflowRow, _>
        {
          [FindByXPath("h2[contains(@id, 'WorkflowHeader')]")]
          public H2<_> WorkflowName { get; private set; }
        }

        [ControlDefinition("h2[contains(@id, 'WorkflowHeader')]/../../../../following-sibling::div/table/tbody/tr"), ComponentTypeName = "row")]
        public class WorkflowRow: TableRow<_>
        {
            [FindByColumnHeader(HeaderName1)]
            public Content<string, _> TableData1 { get; private set; }

            [FindByColumnHeader(HeaderName2)]
            public Content<string, _> TableData2 { get; private set; }

            [FindByColumnHeader(HeaderName3)]
            public Content<string, _> TableData3 { get; private set; }

            [FindByColumnHeader(HeaderName4)]
            public Content<string, _> TableData4 { get; private set; }

            [FindByColumnHeader(HeaderName5)]
            public Content<string, _> TableData5 { get; private set; }

            [FindByColumnHeader(HeaderName6)]
            public Content<string, _> TableData { get; private set; }
        }
    }
}

当我到达这个页面并尝试访问任何一个TableData时,我会得到以下错误:

代码语言:javascript
复制
{"Unable to locate element: By.XPath: (.//h2[contains(@id, 
'WorkflowHeader')]/../../../../following-sibling::div/table/tbody/tr) 
[1]\r\nContext element:\r\nTag: table\r\nLocation: {X=X,Y=Y}\r\nSize: 
{Width=Width, Height=Height}\r\nText: HeaderName1 HeaderName2 HeaderName3 
HeaderName4 HeaderName5 HeaderName6\r\nTableData1 TableData2 TableData3 
TableData4 TableData5 TableData6"}

我觉得我没有正确地使用ControlDefinitions。我的XPath是健全的,并且正在返回多个元素。如果提取用于查找元素的XPath并使用AtataContext.Current.Driver.FindElementsByXPath(".//h2[contains(@id, 'WorkflowHeader')]/../../../../following-sibling::div/table/tbody/tr")[1],则返回正确的行。

注意:这段代码被混淆了,任何变量或键入错误的拼写都很可能是由于在本文中手工输入代码的一部分。代码构建并运行。

任何帮助都是非常感谢的。

EN

回答 1

Stack Overflow用户

发布于 2018-06-09 06:04:32

我假设您不需要ControlDefinitionWorkflowRow类。把它移开试一试。当您找到表的行时,它已经被限定为适当的<table>元素,并查找该元素中的子(行),而不是整个页面。

我还可以建议您将ControlDefinition of WorkflowTable更新为:

代码语言:javascript
复制
[ControlDefinition("table[.//h2[contains(@id, 'WorkflowHeader')]]", ComponentTypeName = "table")]
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/50769230

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档