staleelementException单击角网页中的tablerow时


<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的片段,它是一行,是通过namecustomer" allard'的客户进行搜索操作的结果。我想单击此客户继续下一页,但是大多数时候这会导致StaleElementException。

我使用量角器和无量角器尝试了两种不同的方式。

第一条方法:

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();
            }
        }

问题(我认为(

使用StaleReferenceExceptions,以前创建的iWeblement不再附加到DOM上(您可能已经知道这一点(。最有可能发生的是:
1:您单击搜索。
2:硒执行driver.FindElement(...)并找到匹配元素。
3:然后搜索功能完成和DOM更新。
4:然后硒试图单击该元素(不再存在,导致StaleelementException。硒的眼中相同的元素。(

您的陈述说这发生了"大多数时间" "使我怀疑这种情况更是如此,因为例外将取决于事件的顺序,这取决于相对的不同硒的速度与网页。

如何解决(如果这是您的问题(

您需要在页面上找到可以向硒指示搜索操作的内容。这是编写GUI自动化脚本的创造力。如果页面上有一些内容,您知道会因负载而改变,请明确等待以确保完成。也许有一个加载条出现,或者在完成搜索后会出现一条消息。您可以在单击搜索之前抓住上与搜索不匹配的元素,然后进行明确的等待,以确保其消失在继续寻找结果之前 do 期望在那里。

在下面看起来像这样。

# Search action performed before this.
WebDriverWait wait= new WebDriverWait(driver, TimeSpan.FromSeconds(secondsToWait));
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.XPath( expressionForElementThatWillDissapear )));

IWebElement elem = driver.FindElement(By.XPath("//*[contains(text(),'" + nameCustomer + "')]//parent::div[contains(@id,'crm')]"));
            ExplicitWait.WaitAndClick(driver, elem);

我建议制作该方法以实现上面的明确等待。这些情况会经常出现。

相关内容

  • 没有找到相关文章

最新更新