【发布时间】:2017-06-07 14:29:27
【问题描述】:
<div id="crm" class="row gridrow clickable ng-scope" ng-repeat="customer in customerList" ng-click="gotoRecord(customer.id)">
<i class="col m1 s1 tiny fa fa-male"></i>
<div class="col m3 s11 ng-binding"> Allard</div>
<div class="col m2 s12 ng-binding"></div>
</div>
我有这个 HTML 的 sn-p,它是作为对 nameCustomer 'Allard' 的客户的搜索操作的结果显示的一行。我想单击该客户继续到下一页,但大多数情况下这会导致 StaleElementException。
我尝试了两种不同的方法,使用 Protractor 和不使用 Protractor。
第一种方式:
IWebElement elem = driver.FindElement(By.XPath("//*[contains(text(),'" + nameCustomer + "')]//parent::div[contains(@id,'crm')]"));
ExplicitWait.WaitAndClick(driver, elem);
第二种方式:
var customers = driver.FindElements(NgBy.Repeater("customer in customerList"));
foreach (var customer in customers)
{
if (elem.Text.Equals(nameCustomer))
{
elem.Click();
}
}
【问题讨论】:
-
1.在此表出现之前是否有任何事件发生?即表格隐藏在页面上,或者它可能预先填充了一些其他数据? 2.你试过更精确的xpath吗?您的 xpath 只是尝试查找与页面上的文本匹配的 smthn
-
1. 最初,该表填充了数据库中的前 20 位客户,在搜索后,他们将被满足搜索条件的客户替换。 2.文本即客户名是唯一标识表格行的唯一属性。
-
1.我假设 Allard 是前 20 个客户之一? 2. //div[@id='crm']/div[text()='Allard'] - 或者如果你 100% 确定元素是唯一的并且上面的情况是正确的,那么就不需要它.
-
1.你是对的,我正在寻找的客户在第一页上,并且在我开始搜索操作时已经出现,但与搜索操作后的位置相比,它位于另一个位置。当相同的测试正在寻找没有出现在第一页的客户时,它永远不会失败(我尝试了超过 30 次)。 @Tyler Nielsen 下面的答案是对这种行为的完美解释。
标签: c# angularjs selenium-webdriver protractor-net