Сбой переключения окон Selenium

Я пишу веб-скребок, используя Selenium, который должен быть многопоточным.

// selenium imports from org.openqa omitted
public class wpn
{
    private String sessionId = "";
    private String windowHandle = "";
    private WebDriver driver;

    public wpn (String id)
    {
        sessionId = id;
    }

    public void openDriver (String driverType)
    {
        if (driverType.equals ("ie"))
        {
            DesiredCapabilities capabilities = DesiredCapabilities.internetExplorer();
            capabilities.setCapability(InternetExplorerDriver.INTRODUCE_FLAKINESS_BY_IGNORING_SECURITY_DOMAINS, true);
            capabilities.setCapability(InternetExplorerDriver.IE_ENSURE_CLEAN_SESSION, true);
            capabilities.setCapability("requireWindowFocus", true);
            System.setProperty("webdriver.ie.driver", "c:\\temp\\ieDriver.exe");
            driver = new InternetExplorerDriver(capabilities);
            driver.manage().window().maximize();
        }
        else if (driverType.equals ("chrome"))
        {
            DesiredCapabilities capabilities = DesiredCapabilities.chrome();
            capabilities.setCapability(CapabilityType.ForSeleniumServer.ENSURING_CLEAN_SESSION, true);
            System.setProperty("webdriver.chrome.driver", "c:\\temp\\chromedriver.exe");
            driver = new ChromeDriver (capabilities);
            driver.manage().window().maximize();
        }
        else if (driverType.equals ("phantom"))
        {
            File file = new File("c:\\temp\\phantomJSDdriver.exe");
            System.setProperty("phantomjs.binary.path", file.getAbsolutePath ());
            DesiredCapabilities capabilities = new DesiredCapabilities();
            capabilities.setJavascriptEnabled(true);
            capabilities.setCapability(PhantomJSDriverService.PHANTOMJS_CLI_ARGS, new String[] {"--web-security=no", "--ignore-ssl-errors=yes"});
            driver = new PhantomJSDriver(capabilities);
            Dimension dimension = new Dimension (1280, 1024);
            driver.manage().window().setSize (dimension);
        }
        else if (driverType.equals ("firefox"))
        {
            System.setProperty ("webdriver.gecko.driver", "c:\\temp\\geckodriver.exe");
            FirefoxOptions options = new FirefoxOptions ();
            options.setBinary (c:\\temp\\firefoxdriver.exe");
            options.addArguments("--headless");
            driver = new FirefoxDriver(options);
            driver.manage().window().maximize();
        }
        else
        {
            System.println("unrecognised driver type " + driverType); 
        }

        System.setProperty ("https.protocols", "TLSv1.2");
    }

    public void login (String loginUrl)
    {
        driver.get(loginUrl);
        windowHandle = driver.getWindowHandle ();
    }

    public void getInfo (String infoUrl)
    {
        try
        {
            String wh = driver.getWindowHandle ();
            if (!wh.matches(windowHandle))
            {
                driver.switchTo(windowHandle);
            }

            driver.get(infoUrl);
        }
        catch (Exception e)
        {
            System.out.println (e.getMessage ());
        }
    }
}

int main (String[] args)
{
    wpn session_1 = new wpn ("101");
    wpn session_2 = new wpn ("202");

    String driverType = args[0];
    session_1.openDriver (driverType);
    session_2.openDriver (driverType);

    session_1.login ("http://myService.com/login");
    session_2.login ("http://myService.com/login");

    session_2.info ("http://myService.com/info");
    // proceeds OK, because window handles match

    session_1.info ("http://myService.com/info");
    // produces failure when attempting to switch to session_1's window
}

С драйвером ie ошибка выглядит примерно так:

No window found  
Build info: version: '3.5.0', revision: '8def36e068', time: '2017-08-10T23:00:22.093Z'  
System info: host: 'HUWG', ip: '192.168.0.215', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_144'  
Driver info: org.openqa.selenium.ie.InternetExplorerDriver  
Capabilities [{acceptInsecureCerts=false, browserVersion=11, se:ieOptions={nativeEvents=true, browserAttachTimeout=0.0, ie.ensureCleanSession=true, elementScrollBehavior=0.0, enablePersistentHover=false, ie.browserCommandLineSwitches=, ie.forceCreateProcessApi=false, requireWindowFocus=true, initialBrowserUrl=http://localhost:40976/, ignoreZoomSetting=false, ie.fileUploadDialogTimeout=3000.0, ignoreProtectedModeSettings=true}, browserName=internet explorer, pageLoadStrategy=normal, unhandledPromptBehavior=dismiss, javascriptEnabled=true, platformName=windows, setWindowRect=true, platform=ANY}]  
Session ID: cd72bba0-f105-43a8-a234-cbb494c19d8c  

В Chrome это примерно так:

no such window  
  (Session info: chrome=67.0.3396.99)  
  (Driver info: chromedriver=2.40.565498  
 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)  
Command duration or timeout: 0 milliseconds  
Build info: version: '3.13.0', revision: '2f0d292', time: '2018-06-25T15:32:19.891Z'  
System info: host: 'HUWG', ip: '192.168.0.215', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_144'  
Driver info: org.openqa.selenium.chrome.ChromeDriver  
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.40.565498 (ea082db3280dd6..., userDataDir: C:\Users\gallonh\AppData\Lo...}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 67.0.3396.99, webStorageEnabled: true}  
Session ID: c4c74d5258c723a0a09dbbf7284b1c48

С драйвером phantomJS это примерно так:

no such window  
  (Session info: chrome=67.0.3396.99)  
  (Driver info: chromedriver=2.40.565498  
 (ea082db3280dd6843ebfb08a625e3eb905c4f5ab),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)  
Command duration or timeout: 0 milliseconds  
Build info: version: '3.13.0', revision: '2f0d292', time: '2018-06-25T15:32:19.891Z'  
System info: host: 'HUWG', ip: '192.168.0.215', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_144'  
Driver info: org.openqa.selenium.chrome.ChromeDriver  
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 2.40.565498 (ea082db3280dd6..., userDataDir: C:\Users\gallonh\AppData\Lo...}, cssSelectorsEnabled: true, databaseEnabled: false, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, unexpectedAlertBehaviour: , unhandledPromptBehavior: , version: 67.0.3396.99, webStorageEnabled: true}  
Session ID: c4c74d5258c723a0a09dbbf7284b1c48

С драйвером Firefox дескриптор каждого окна, открытого Selenium, — «4294967297», поэтому окно никогда не переключается.

Для драйверов IE и phantomJS я создаю приложение с помощью selenium-server-standalone-3.5.0.jar. Для драйверов Chrome и Firefox я создаю приложение с помощью selenium-server-standalon-3.13.0.jar.


person HLGallon    schedule 18.07.2018    source источник
comment
Пожалуйста, отредактируйте вопрос, чтобы ограничить его конкретной проблемой с достаточной детализацией, чтобы найти адекватный ответ. Не задавайте сразу несколько разных вопросов. См. страницу Как спросить, чтобы уточнить этот вопрос.   -  person DebanjanB    schedule 18.07.2018


Ответы (2)


Вы используете совпадения, которые являются совпадением регулярных выражений. driver.getWindowHandle возвращает строку, и вы должны использовать equals для проверки на равенство. Кроме того, поскольку вы не переключаете окна после session.login(...) и до session.info(...), излишне проверять, указывает ли драйвер на одно и то же окно.

Вы инициализировали два отдельных экземпляра драйверов, которые ссылаются на собственные окна браузера. Между экземплярами драйвера, которые управляют собственным сеансом браузера, нет «перекрестных помех».

Если вы все еще хотите проверить, указываете ли вы на то же окно, используйте wh.equals(windowHandle).

person sagarwadhwa1    schedule 18.07.2018

Вы предоставили трассировку стека ошибок, используя следующие варианты WebDriver:

  • Драйвер InternetExplorer`
  • chromedriver=2.40
  • PhantomJSDriver

Прежде всего, стоит отметить, что разные браузерные клиенты отображают < strong>HTML DOM другим способом. Возможно, если бы вы могли сузить свой вопрос до определенного варианта WebDriver/Browser Client, отладка проблемы была бы намного проще.

При анализе всех трех фрагментов журналов трассировки ошибок кажется, что проблема связана с переключением окон/вкладок, где ошибка читается как:

  • No window found (InternetExplorerDriver)
  • no such window (chromedriver=2.40)
  • no such window (PhantomJSDriver)

Однако ваша основная проблема, по-видимому, заключается в несовместимости между версиями двоичных файлов, которые вы используете, следующим образом:

  • Хотя вы используете selenium-server-standalone-3.5.0.jar и selenium-server-standalon-3.13.0.jar альтернативно
  • Ваша версия JDK кажется 1.8.0_144, что довольно старо и < strong>древний.

Решение

Настройте Test Bed для выполнения вашего Test Suite с самыми последними бинарными файлами GA:

person DebanjanB    schedule 18.07.2018