【问题标题】:Parallel Testing Thread Getting Orphaned Selenium并行测试线程获取孤立的 Selenium
【发布时间】:2020-11-26 06:50:51
【问题描述】:

我的测试在我的虚拟机上执行。 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;
}

}

【问题讨论】:

    标签: selenium selenium-webdriver grid


    【解决方案1】:

    将 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();
    }
    

    }

    【讨论】:

    • 谢谢你测试一下。这会干扰我的范围报告吗?
    • 好的,我这样做了,我所有的测试类都有一个红色的 X 我可以在其他测试类中选择更改为 ThreadLocal driver public DirectoryPage(ThreadLocal driver2) { this.司机=司机2; } 是的,我在 driver2 下有一条红线
    • 问题是将 ThreadLocal 驱动程序传递给我的其他测试用例的基本测试工作问题,任何帮助将不胜感激。
    【解决方案2】:

    尝试在下面给出的示例中设计您的基类 公共类 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);
    }
    

    }

    【讨论】:

    • 将尝试此操作并回复您的结果
    猜你喜欢
    • 2021-10-18
    • 1970-01-01
    • 1970-01-01
    • 2012-03-08
    • 2023-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-31
    相关资源
    最近更新 更多