Поток параллельного тестирования, получающий осиротевший селен - PullRequest
0 голосов
/ 06 августа 2020

Мой тест выполняется на моей виртуальной машине. Сначала загружается Chrome, а затем IE. IE Завершает тест, но Chrome становится сиротой. Я думаю, это как-то связано с потоками, соединяющимися с правильным браузером.

Я много часов пробовал пробовать разные способы настройки параллельного тестирования с помощью Selenium / TestNG, и результат такой же, как я описал выше.

Моя цель - выполнить тест обоими браузерами. Не могли бы вы мне помочь. Пожалуйста, найдите мой код ниже.

public class BaseTestDirectory {
// -------Reference Variables-------------
// ----- Regression Test Cases -----
LoginLogoutPage objBELogin;
HomeNavigationPage obj_navigation;
DirectoryPage obj_directory;
// -------------------------------
protected static WebDriver driver;
protected ExtentTest test;// --parent test
ExtentReports report;
ExtentTest childTest;

@BeforeClass
 @Parameters(value={"browser"})
    public void setUp(String browser) throws InterruptedException, MalformedURLException {
    // --------Extent Report--------
    
    if(browser.equals("Chrome")){ 
        
            report = ExtentManager.getInstance();
            System.setProperty("webdriver.chrome.driver", "C:\\GRID\\chromedriver.exe");

            System.out.println(System.getenv("BUILD_NUMBER"));
            String env = System.getProperty("BUILD_NUMBER");
            
            if (env == null) {
                driver = new RemoteWebDriver(new URL(COMPLETE_NODE_URL), OptionsManager.getChromeOptions());
                driver.get(HOME_PAGE);
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
            } else {
                driver = new ChromeDriver();
                driver.get(HOME_PAGE);
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                }
            }
    
    else if (browser.equals("IE")) {
                
                report = ExtentManager.getInstance_IE();
                System.setProperty("webdriver.ie.driver", "C:\\GRID\\IEDriverServer.exe");

                System.out.println(System.getenv("BUILD_NUMBER"));
                String env = System.getProperty("BUILD_NUMBER");
                
                driver = new RemoteWebDriver(new URL(COMPLETE_NODE_URL), OptionsManager.getInternetExplorerOptions());
                driver.get(HOME_PAGE);
                driver.manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
                
            }
    
}

public class OptionsManager {

//Get Chrome Options
// --https://stackoverflow.com/questions/43143014/chrome-is-being-controlled-by-automated-test-software
// --https://stackoverflow.com/questions/56311000/how-can-i-disable-save-password-popup-in-selenium
public static ChromeOptions getChromeOptions() {
    ChromeOptions options = new ChromeOptions();
    options.setExperimentalOption("useAutomationExtension", false);
    options.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
    options.addArguments("--disable-features=VizDisplayCompositor");
    options.addArguments("--start-maximized");
    Map<String, Object> prefs = new HashMap<String, Object>();
    prefs.put("credentials_enable_service", false);
    prefs.put("profile.password_manager_enabled", false);
    options.setExperimentalOption("prefs", prefs);
    
    DesiredCapabilities capability = DesiredCapabilities.chrome();
    capability.setCapability(CapabilityType.BROWSER_NAME, "Chrome");
    capability.setPlatform(Platform.XP);
    capability.setBrowserName("Chrome");
    capability.setCapability(ChromeOptions.CAPABILITY, options);
    options.merge(capability);
    return options;
}


public static InternetExplorerOptions getInternetExplorerOptions () {
    InternetExplorerOptions capabilities = new InternetExplorerOptions();
    capabilities.ignoreZoomSettings();
    capabilities.setCapability("browser.download.folderList", 2);
    capabilities.setCapability("browser.download.manager.showWhenStarting", false);
    capabilities.setCapability("browser.helperApps.neverAsk.saveToDisk","application/octet-stream;application/csv;text/csv;application/vnd.ms-excel;");
    capabilities.setCapability("browser.helperApps.alwaysAsk.force", false);
    capabilities.setCapability("browser.download.manager.alertOnEXEOpen", false);
    capabilities.setCapability("browser.download.manager.focusWhenStarting", false);
    capabilities.setCapability("browser.download.manager.useWindow", false);
    capabilities.setCapability("browser.download.manager.showAlertOnComplete", false);
    capabilities.setCapability("browser.download.manager.closeWhenDone", false);
    //capabilities.setCapability(InternetExplorerDriver.IE_SWITCHES, "-private");
    //capabilities.setCapability("requireWindowFocus", true);
    return capabilities;
}

}

Ответы [ 2 ]

0 голосов
/ 07 августа 2020

Попробуйте создать свой базовый класс в приведенном ниже примере publi c class WebDriverFactory {

static WebDriver create(String type) throws IllegalAccessException{
    WebDriver driver;
    
    switch(type) {
      
    case "Firefox":
          driver = new FirefoxDriver();
          break;
    case "Chrome":
          driver = new ChromeDriver();
          break;
    default:
         throw new IllegalAccessException();
    }
    
    return driver;
}

}

 public class BaseClass extends WebDriverFactory  {

public static ThreadLocal<WebDriver> dr = new ThreadLocal<WebDriver>();

@Parameters("browser")
@BeforeMethod
public void beforemethod() throws IllegalAccessException{
    
    WebDriver driver = new WebDriverFactory().create(browser);
    setWebDriver(driver);
    
    
    getWebDriver().manage().window().maximize();
    getWebDriver().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
}


public void setWebDriver(WebDriver driver){
    dr.set(driver);
}


public WebDriver getWebDriver(){
    return dr.get();
}

@AfterMethod
public void aftermethod(){
    getWebDriver().quit();
    dr.set(null);
}

}

0 голосов
/ 06 августа 2020

Инициализация объекта WebDriver как локального потока для параллельного выполнения тестов: когда вы решили запустить тесты Selenium параллельно, ваш объект Webdriver должен быть потокобезопасным, т.е. один объект может использоваться с несколькими потоками одновременно без проблем.

public class BaseTest {
   //Declare ThreadLocal Driver (ThreadLocalMap) for ThreadSafe Tests
    protected static ThreadLocal<RemoteWebDriver> driver = new ThreadLocal<>();
    public CapabilityFactory capabilityFactory = new CapabilityFactory();

@BeforeMethod
@Parameters(value={"browser"})
public void setup (String browser) throws MalformedURLException {
    //Set Browser to ThreadLocalMap
    driver.set(new RemoteWebDriver(new URL("http://localhost:4444/wd/hub"), capabilityFactory.getCapabilities(browser)));
}

public WebDriver getDriver() {
    //Get driver from ThreadLocalMap
    return driver.get();
}

@AfterMethod
public void tearDown() {
    getDriver().quit();
}

@AfterClass void terminate () {
    //Remove the ThreadLocalMap element
    driver.remove();
}

}

...