【发布时间】:2019-04-01 14:00:33
【问题描述】:
一个临时的 CSS 元素遮住了我想要点击的 xpath 元素。
在 Visual Studio 中使用 Selenium 我正在编写一个要单击元素的测试用例。但是当我运行这个测试用例时,我收到一条错误消息告诉我:
OpenQA.Selenium.ElementClickInterceptedException Element <a href="#/app/customer/handling/devices"> is not clickable at point (105,221) because another element <div class="showbox layout-align-center-center layout-row ng-star-inserted"> obscures it
遮蔽元素似乎是一个 CSS 元素。但是当我手动转到这个页面时,检查代码并搜索这个 css 元素
<div class="showbox layout-align-center-center layout-row ng-star-inserted">我没有得到任何结果。
因此,我假设此 CSS 元素是临时的,并且只能在页面加载时识别几秒钟。如果我在这个测试用例中放置一个静态等待方法Task.Delay(4000).Wait();,我就能完成这个测试用例,这一事实证实了这个假设。
但我对在代码中使用静态等待方法的解决方案不感兴趣。我希望能够等待临时 css 消失,以便单击所需的 xpath 元素。
这是我的代码:
var wait = new WebDriverWait(driver, TimeSpan.FromSeconds(30));
wait.Until(ExpectedConditions.ElementIsVisible(By.CssSelector("div class='showbox layout-align-center-center layout-row ng-star-inserted'")));
//Waiting for temporary CSS element to be visible
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.CssSelector("div class='showbox layout-align-center-center layout-row ng-star-inserted'")));
//Waiting for temporary CSS element to disappear
wait.Until(ExpectedConditions.ElementToBeClickable(By.XPath("//div/div[2]/nav[2]/div/ul/li[1]/a"))).Click();
//Click on "Handle Tools" link
正如您在我的代码中的 cmets 所看到的,我在这里做了三件事:
1. I wait for the temporary CSS to be loaded
2. I wait for it to disappear
3. I click on the xpath element.
当我这样做时,我收到一条错误消息,告诉我我尝试查找的 CSS 选择器无效。
如果我跳过第一步,只是等待 CSS 消失/“不可见”,它会检查这一点太快,并在 CSS 元素开始加载之前查看。
所以要么我没有正确编写 By.CssSelector 格式。或者 CSS 元素在我上面引用的错误消息中被称为 Visual Studio 之外的其他名称。
如果我在这里使用了错误的方式来识别这个 CSS 元素,请告诉我:
wait.Until(ExpectedConditions.InvisibilityOfElementLocated(By.CssSelector("div class='showbox layout-align-center-center layout-row ng-star-inserted'")));
或
还有其他方法可以动态等待临时 CSS 元素吗?
或
我能否以某种方式确认隐藏 CSS 元素的名称实际上称为“div class='showbox layout-align-center-center layout-row ng-star-inserted'”?
【问题讨论】:
-
仅供参考 - 当发生此类问题时,您可以使用 Javascript 单击元素。
标签: c# css selenium webdriverwait