如何关闭使其他元素模糊的永久元素?

时间:2019-04-04 12:36:13

标签: c# css selenium element sendkeys

我无法单击某个元素,因为下拉菜单遮盖了所有其他元素。

在Visual Studio中使用Selenium,我试图构建一个测试用例,首先单击下拉菜单中的复选框,然后单击下拉菜单外的另一个元素。但是,单击第一个复选框后,下拉菜单不会自行关闭。

如果您在网络浏览器上手动关闭此下拉列表,则只需单击Esc或单击下拉菜单外的某个位置即可。但是当我尝试使它自动化时,它是行不通的。

我尝试在脚本中按如下所示按Esc键:

Actions action = new Actions(driver);
action.SendKeys(OpenQA.Selenium.Keys.Escape);

但是它不起作用。尝试单击被遮盖的元素时,它不会发送有关发送Esc键的错误,而是在下一行发送超时:

OpenQA.Selenium.ElementClickInterceptedException : Element <div class="mat-radio-outer-circle"> is not clickable at point (116,608) because another element <div class="cdk-overlay-backdrop cdk-overlay-transparent-backdrop cdk-overlay-backdrop-showing"> obscures it

我还尝试过,而不是发送Esc键,而是在下拉菜单外部单击,如下所示:

wait.Until(ExpectedConditions.ElementIsVisible(By.XPath("//div[3]/div[3]"))).Click();

这在Visual Studio中不起作用,但是在Selenium IDE中起作用,仅使用命令click并将//div[3]/div[3]设置为目标即可。

Selenium IDE Example

我尝试使用IDE中的select函数来确定下拉菜单中未包含的其他元素。我也尝试过使用萤火虫。但这是在下拉菜单之外唯一可单击的元素。

Firebug view

总结:

  1. 请告诉我我发送“ Esc”的代码是否错误。

  2. 当可以在Selenium IDE中进行操作时,为什么Visual Studio无法识别并单击下拉列表外的//div[3]/div[3]

  3. 还有另一种关闭下拉菜单的方法吗?

  4. 我已阅读到您始终可以单击使用javascript遮盖的元素,但是我没有找到在C#中执行此操作的指南。请告诉我你们是否知道该怎么做。

2 个答案:

答案 0 :(得分:1)

我总是会尝试使用列表项的xpath或css direct来选择列表项,而不是单击列表框并选择。通过这种方式,我们可以忽略这种麻烦,并且它也更快。 怎么做:

driver.FindElement(By.Xpath("//select[@attribute='attributeValue']/li[@attribute='attributeValue'])).click

这是Javascript方法。请参考以下2个链接https://seleniumhq.github.io/selenium/docs/api/java/org/openqa/selenium/JavascriptExecutor.html

https://seleniumhq.github.io/selenium/docs/api/dotnet/html/M_OpenQA_Selenium_IJavaScriptExecutor_ExecuteScript.htm

IWebDriver driver; // assume assigned elsewhere
IJavaScriptExecutor js = (IJavaScriptExecutor)driver;
// if you want to click on element
IWebElement element = driver.FindElement(By.CssSelector("your css locator goes here")) 

// if you want to return value from javascript and store
string title = (string)js.ExecuteScript("return document.title");

如果要隐藏模糊元素,这是使用js的逻辑。

element = driver.FindElement(By.Xpath("//div[@class='cdk-overlay-backdrop cdk-overlay-transparent-backdrop cdk-overlay-backdrop-showing']")); // this is the obscuring element in your case.
js.ExecuteScript("arguments[0].setAttribute("style","display: none;");",element);

答案 1 :(得分:0)

在这种情况下,解决方案是单击隐藏页面其余部分的元素:

driver.FindElement(By.CssSelector(".cdk-overlay-backdrop.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing")).Click();

当我这样做时,下拉列表关闭。

注意:我必须对CSSSelector使用另一种格式才能识别该元素。

在我之前得到的错误消息中,遮蔽元素是由Visual Studio编写的,

cdk-overlay-backdrop cdk-overlay-transparent-backdrop cdk-overlay-backdrop-showing

但是我不能仅仅将其复制到CSSSelector中,似乎您总是必须添加一个“”。在CSSSelector ID的开头,然后用“。”替换元素名称中的所有空格。

赞:

.cdk-overlay-backdrop.cdk-overlay-transparent-backdrop.cdk-overlay-backdrop-showing