Как использовать ThreadLocal‹WebDriver› в объектной модели страницы

Я работаю над этим проектом автоматизации уже 2 года и сейчас пытаюсь реализовать параллельное тестирование с помощью ThreadLocal. Я провел много исследований по этому вопросу и реализовал ThreadLocal driver = new ThreadLocal‹›(); в моем BaseTestClass. Моя проблема в том, что я использую объектную модель страницы, где каждая страница представляет собой класс с объектами. Eclipse говорит изменить конструктор на

public LoginLogoutPage(ThreadLocal<WebDriver> driver) {
        this.driver = driver;
}

Я делаю это, затем мне предлагается сменить драйвер WebDriver; к драйверу ThreadLocal. После того, как я это сделаю, у всех моих беглых ожиданий под ними появится красная черта, говорящая

"The constructor FluentWait<WebDriver>(ThreadLocal<WebDriver>) is undefined"

Однако я не знаю, как это исправить. Вот фрагмент ниже.

public class BaseTestCriticalScenarios {
protected static ThreadLocal<WebDriver> driver = new ThreadLocal<>();
@BeforeClass
public void setUp() throws InterruptedException, MalformedURLException {
    // --------Extent Report--------
    report = ExtentManager.getInstance();
    // -----------------------------
    System.setProperty("webdriver.chrome.driver", "C:\\GRID\\chromedriver.exe");
    ChromeOptions option = new ChromeOptions();
    // --https://stackoverflow.com/questions/43143014/chrome-is-being-controlled-by-automated-test-software
    option.setExperimentalOption("useAutomationExtension", false);
    option.setExperimentalOption("excludeSwitches", Collections.singletonList("enable-automation"));
    // --https://stackoverflow.com/questions/56311000/how-can-i-disable-save-password-popup-in-selenium
    option.addArguments("--disable-features=VizDisplayCompositor");
    option.addArguments("--start-maximized");
    option.addArguments("--disable-gpu");
    Map<String, Object> prefs = new HashMap<String, Object>();
    prefs.put("credentials_enable_service", false);
    prefs.put("profile.password_manager_enabled", false);
    option.setExperimentalOption("prefs", prefs);
    System.out.println(System.getenv("BUILD_NUMBER"));
    String env = System.getProperty("BUILD_NUMBER");
    
    if (env == null) {
        DesiredCapabilities capability = DesiredCapabilities.chrome();
        capability.setCapability(CapabilityType.BROWSER_NAME, "Chrome");
        capability.setCapability(ChromeOptions.CAPABILITY, option);
        option.merge(capability);
        
        driver.set(new RemoteWebDriver(new URL(COMPLETE_NODE_URL), capability));
        getDriver().get(HOME_PAGE);
        getDriver().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    } else {
        driver.set(new ChromeDriver(option));
        getDriver().manage().window().maximize();
        getDriver().get(HOME_PAGE);
        getDriver().manage().timeouts().implicitlyWait(10, TimeUnit.SECONDS);
    }
}

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

Ниже приведен класс объекта моей страницы

введите здесь описание изображения

Любая помощь будет оценена по достоинству.


person Jonathan    schedule 27.05.2021    source источник
comment
почему бы не инициализировать новый драйвер для каждого класса/потока? Нет необходимости использовать threadlocal. (Раньше я не использовал threadlocal, поэтому, возможно, в этом есть преимущество, которого я не вижу.) Например, я использую класс, который расширяет SwingWorker. Он инициализирует драйвер и запускает все задачи ... затем вы можете создать столько из них, сколько хотите, и вызвать .execute для запуска ... который вызывает переопределенный метод doInBackground () (инициализировать драйвер, запускать задачи) .. и затем завершает работу экземпляр драйвера в методе done().   -  person pcalkins    schedule 28.05.2021
comment
Кстати, вам следует избегать смешивания неявных и явных ожиданий. (два цикла опроса могут/будут конфликтовать друг с другом... просто используйте webdriverwait... это предварительно настроенный fluentwait.)   -  person pcalkins    schedule 28.05.2021
comment
@pcalkins спасибо за ваш ответ, можете ли вы привести пример инициализации нового драйвера для каждого класса?   -  person Jonathan    schedule 28.05.2021
comment
@pcalkins Моя цель состоит в том, чтобы 2 экземпляра драйвера Chrome работали одновременно с разными тестовыми примерами, мой файл test.xml настроен таким образом ‹test name=Test parallel=classes thread-count=2 ›проблема в том, что драйвер не выполняет тест в соответствующем экземпляре. один экземпляр chrome вызывается, а другой запускается.   -  person Jonathan    schedule 28.05.2021
comment
включите свой основной метод в свой пост... (или что-то еще, что запускает весь тест... здесь вы захотите создать 2 потока/экземпляра основного класса)   -  person pcalkins    schedule 28.05.2021
comment
Вы можете просто реализовать в этом классе исполняемые мысли. Затем переместите все вызовы методов в метод запуска. ( docs.oracle.com/javase/7/docs /api/java/lang/Runnable.html ) Что-то вроде этого: YourMainClass thisThread = new YourMainClaass(); thisThread.run(); YourMainClass thisThread2 = new YourMainClass(); thisThread2.run();   -  person pcalkins    schedule 28.05.2021