Как закрыть постоянный элемент, скрывая другие элементы? - PullRequest
1 голос
/ 04 апреля 2019

Я не могу щелкнуть элемент из-за раскрывающегося меню, скрывающего все остальные элементы.

Используя Selenium в Visual Studio, я пытаюсь создать тестовый сценарий, в котором я сначала нажимаю на флажок в раскрывающемся меню, а затем нажимаю на другой элемент вне раскрывающегося списка. Однако раскрывающееся меню не закрывается после того, как вы щелкнули первый флажок.

Если вы закрываете это раскрывающееся меню вручную в веб-браузере, вам нужно всего лишь нажать клавишу 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] в качестве цели.

Селен IDE Пример

Я попытался использовать функцию выбора в IDE для определения других элементов, не включенных в раскрывающееся меню. Я также пытался использовать Firebug. Но это единственный элемент, который можно активировать за пределами выпадающего меню.

Firebug view

Подведем итог:

  1. Скажите, пожалуйста, неверен ли мой код для отправки "Esc".

  2. Почему Visual Studio не может распознать и щелкнуть //div[3]/div[3], т. Е. За пределами раскрывающегося списка, когда это возможно сделать в Selenium IDE?

  3. Есть ли другой способ закрыть выпадающее меню?

  4. Я читал, что вы всегда можете нажать на элементы, которые скрыты с помощью javascript, но я не нашел руководства, как это сделать в C #. Скажите, пожалуйста, ребята, знаете ли вы, как это сделать.

Ответы [ 2 ]

1 голос
/ 04 апреля 2019

Я бы всегда пытался выбирать элементы списка, используя 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);
0 голосов
/ 12 апреля 2019

Решением в этом случае было нажатие на элемент, закрывающий остальную часть страницы:

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 и замените все пробелы в имени элемента на «.»

Примерно так:

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