Проблема переключения окон Selenium WebDriver в Internet Explorer 8-10 - PullRequest
4 голосов
/ 31 августа 2011

Я обнаружил проблему при попытке использовать Selenium WebDriver для тестирования нашего приложения. Проблема в нестабильных всплывающих окнах, фокусирующихся на IE9 Это не всегда воспроизводимо, это происходит примерно при 20% переключения окон, но делает тестирование на IE практически невозможным. В FireFox все работает отлично.

  1. Я пытаюсь увеличить время ожидания:

TimeSpan interval = new TimeSpan(0, 0, 10); driver.Manage().Timeouts().ImplicitlyWait(interval);

* * 1010

Создание собственных методов поиска объектов:

           for (int x = 0; x <= waitTimeOut; x++)
            {
                try
                {
                    element = (IWebElement)driver.FindElement(By.XPath(obj.Xpath));
                    return element;
                }

                catch{}
            }

Попробуйте использовать CssSelecotrs

Попробуйте сделать некоторое переключение, прежде чем найти элемент:

driver.SwitchTo().Window(GetWindowHandle(2, 1)); driver.SwitchTo().Window(GetWindowHandle(0, 1)); driver.SwitchTo().Window(GetWindowHandle(2, 1));

Если проблема возникает, она всегда возникает только с первым элементом, который я пытаюсь найти на странице. Если элемент найден, нет проблем с поиском других элементов на этой странице. Поэтому я решил, что проблема в фокусировке.

Дескрипторы Windows в отладчике отображаются правильно. Например, если я переключаюсь на третье окно, driver.CurrentWindowHandle дает мне правильный дескриптор третьего окна. Но если я пытаюсь найти какой-либо элемент, FindElement () выдает мне исключение. Страница загружена, я могу щелкнуть элемент вручную, но FindElement () не может его найти. Если я перезапущу тест, этот шаг можно будет пройти без проблем и завершиться неудачей только при следующем переключении или далее. Это непредсказуемо.

В чем может быть причина такой проблемы?

Ответы [ 3 ]

11 голосов
/ 07 сентября 2011

При использовании драйвера IE порядок появления окон в коллекции не гарантируется.То есть 0-е окно в коллекции не обязательно является первым окном, открытым сеансом.Учитывая это, вам нужно сделать что-то вроде следующего:

private string FindNewWindowHandle(IWebDriver driver, IList<string> existingHandles, int timeout)
{
    string foundHandle = string.Empty;
    DateTime endTime = DateTime.Now.Add(TimeSpan.FromSeconds(timeout));
    while (string.IsNullOrEmpty(foundHandle) && DateTime.Now < endTime)
    {
        IList<string> currentHandles = driver.WindowHandles;
        if (currentHandles.Count != existingHandles.Count)
        {
            foreach (string currentHandle in currentHandles)
            {
                if (!existingHandles.Contains(currentHandle))
                {
                    foundHandle = currentHandle;
                    break;
                }
            }
        }

        if (string.IsNullOrEmpty(foundHandle))
        {
            System.Threading.Thread.Sleep(250);
        }
     }

     // Note: could optionally check for handle found here and throw
     // an exception if no window was found.
     return foundHandle;
}

Использование вышеупомянутой функции будет примерно таким:

IList<string> handles = driver.WindowHandles;
// do whatever you have to do to invoke the popup
element.Click();
string popupHandle = FindNewWindowHandle(driver, handles, 10);
if (!string.IsNullOrEmpty(popupHandle))
{
    driver.SwitchTo().Window(popupHandle);
}
1 голос
/ 21 апреля 2016

, если это IE11, измените HKLM_CURRENT_USER \ Software \ Microsoft \ Internet Explorer \ Основной путь должен содержать ключ TabProcGrowth со значением 0.

0 голосов
/ 26 февраля 2014
String currentWindowHandle = driver.getWindowHandle();
        driver.findElement(By.cssSelector(locator)).click();
        Set<String> windows = driver.getWindowHandles();
        for (String window : windows) {
            if (!window.equals(currentWindowHandle)) {
                driver.switchTo().window(window);
                driver.close();
            }
        }
        driver.switchTo().window(currentWindowHandle);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...