我正在为我的公司编写一个Page对象,它代表一个HTML页面,其中包含许多表(而且结构很糟糕)。我只对这个页面上的某些表感兴趣,为了简单起见,我希望在page对象上有一个表来引用。
问题
目标
下面是我正在使用的HTML代码的抽象。
<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对象中,我有以下内容:
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时,我会得到以下错误:
{"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],则返回正确的行。
注意:这段代码被混淆了,任何变量或键入错误的拼写都很可能是由于在本文中手工输入代码的一部分。代码构建并运行。
任何帮助都是非常感谢的。
发布于 2018-06-09 06:04:32
我假设您不需要ControlDefinition在WorkflowRow类。把它移开试一试。当您找到表的行时,它已经被限定为适当的<table>元素,并查找该元素中的子(行),而不是整个页面。
我还可以建议您将ControlDefinition of WorkflowTable更新为:
[ControlDefinition("table[.//h2[contains(@id, 'WorkflowHeader')]]", ComponentTypeName = "table")]https://stackoverflow.com/questions/50769230
复制相似问题