GEB: драйвер не установлен как Browser.driver - PullRequest
0 голосов
/ 07 ноября 2018

Я пишу тесты с GEB и Споком (я новичок в обоих).

Драйвер объявлен в GebConfig ( обновлено - добавлен полный файл конфигурации ):

import geb.report.ReportState
import geb.report.Reporter
import geb.report.ReportingListener
import io.github.bonigarcia.wdm.WebDriverManager
import io.qameta.allure.Allure
import org.openqa.selenium.Dimension
import org.openqa.selenium.Point
import org.openqa.selenium.WebDriver
import org.openqa.selenium.chrome.ChromeDriver
import org.openqa.selenium.chrome.ChromeOptions
import org.openqa.selenium.firefox.FirefoxDriver
import org.openqa.selenium.firefox.FirefoxOptions
import org.openqa.selenium.firefox.FirefoxProfile
import org.slf4j.LoggerFactory
import utils.Configuration

def logger = LoggerFactory.getLogger(this.class)

baseUrl = "${Configuration.getStringProperty("BASE_URL")}/${Configuration.getStringProperty("CONTEXT_PATH")}"

baseNavigatorWaiting = true
autoClearCookies = false
cacheDriver = false
reportsDir = 'build/test-reports'

driver = {
    WebDriver dr
    switch (Configuration.getStringProperty("BROWSER_NAME", "chrome").trim().toLowerCase()) {
        case "firefox":
        case "ff":
            dr = new FirefoxDriver(setUpFirefoxOptions())
            break

        case "google chrome":
        case "chrome":
        default:
            dr = new ChromeDriver(setUpGoogleChromeOptions())
    }

    if (Configuration.getBooleanProperty("SET_DRIVER_POSITION", false)) {
        dr.manage().window().setPosition(new Point(
                Configuration.getIntProperty("BROWSER_X_POS", 0),
                Configuration.getIntProperty("BROWSER_Y_POS", 0)))

        dr.manage().window().setSize(new Dimension(
                Configuration.getIntProperty("BROWSER_WIDTH", 1600),
                Configuration.getIntProperty("BROWSER_HEIGHT", 900)));
    } else {
        dr.manage().window().maximize()
    }

    return dr
}

static ChromeOptions setUpGoogleChromeOptions() {
    WebDriverManager.chromedriver().setup()

    ChromeOptions options = new ChromeOptions()

    String args = Configuration.getStringProperty("BROWSER_ARGS")
    if (args) {
        Arrays.stream(args.split("\\s")).each { options.addArguments(it) }
    }
    return options
}

static FirefoxOptions setUpFirefoxOptions() {
    WebDriverManager.firefoxdriver().setup()

    FirefoxOptions options = new FirefoxOptions()
    FirefoxProfile profile = new FirefoxProfile()

    profile.setPreference("network.automatic-ntlm-auth.trusted-uris", "http://,https://")
    options.setProfile(profile).setLegacy(false)
    return options
}

reportingListener = new ReportingListener() {
    void onReport(Reporter reporter, ReportState reportState, List<File> reportFiles) {
        def fileGroups = reportFiles.groupBy { it.name.split("\\.")[-1] }

        fileGroups['png']?.each {
            Allure.addAttachment(it.name, "image/png", new FileInputStream(it), "png")
        }
    }
}

Пример теста выглядит так (код BaseTest добавлен ниже):

class SimulationsRunningSpec extends BaseTest {
    def "My great test"() {
        println("test started")
        setup:
        to LoginPage

        when:
        println("when")

        then:
        println("then")
    }


     def cleanupSpec() {
        browser.quit()
        println "Clean up specification"
    }
}

И я получаю следующую последовательность журналов:

test started
Created driver
when
then

Created driver
Clean up specification 

Таким образом, драйвер создается при вызове to LoginPage.

Проблема: Он не установлен в качестве драйвера браузера, поэтому, когда вызывается browser.quit(), создается новый экземпляр, а затем закрывается (первый по-прежнему открыт).

Вопросы

  1. Как правильно настроить драйвер для браузера, чтобы закрыть его, затем через browser.quit()?

  2. Правильно ли я считаю, что если мне нужно создать драйвер в setupSpec , я могу просто позвонить туда to LoginPage? Или как лучше всего запустить драйвер в предварительных условиях?

UPDATE:

После некоторой отладки я обнаружил, что браузер по какой-то причине становится null и снова создается в cleanupSpec(). Не имеет значения, расширяет ли Spec классы Geb пользовательского базового класса. Это воспроизводит мою проблему:

class TestSpec extends GebReportingSpec {

    def setupSpec() {
        to Page
        println "setupSpec browser: $browser"
    }

    def setup(){
        println "setup browser: $browser"
    }

    def "My first test"() {
        println("test started")

        when:
        println ''

        then:
        println ''
    }

    def cleanup() {
        println "cleanup browser: $browser"
    }

    def cleanupSpec() {
        println "cleanupSpec browser: $browser"
    }
}

Создает следующий вывод:

setupSpec browser: geb.Browser@4beeb0e
setup browser: geb.Browser@4beeb0e
test started


cleanup browser: geb.Browser@4beeb0e
cleanupSpec browser: geb.Browser@5c73f672

Последние две строки показывают, что объект browser в cleanupSpec отличается от созданного объекта в setupSpec.

Ответы [ 2 ]

0 голосов
/ 09 ноября 2018

Я не уверен, почему браузер был закрыт до вашего cleanupSpec. Возможно, какой-то другой механизм уже позаботился об этом.

Однако тот факт, что вы получаете другой экземпляр в вашем cleanupSpec, объясняется просто тем, что getBrowser реализован как ленивый получатель. При необходимости он создает новый экземпляр, как вы можете видеть в коде .

Как правило, вам не нужно звонить browser.quit, используя Geb. Геб прекрасно об этом позаботится.

Обновление

Вот что происходит в GebSpec и YourSpec:

  1. GebSpec.setupSpec срабатывает ⇒ _browser is null
  2. YourSpec.setupSpec срабатывает ⇒ _browser по-прежнему null, если вы не используете его здесь
  3. GebSpec.setup срабатывает ⇒ _browser не изменяется
  4. YourSpec.setup срабатывает ⇒ _browser может быть изменено
  5. YouSpec запущена ⇒ _browser используется, поэтому она не будет null больше
  6. YourSpec.cleanup срабатывает ⇒ _browser не изменяется
  7. GebSpec.cleanup срабатывает ⇒ _browser устанавливается на null! Как видно из кода , вызывается resetBrowser, если YourSpec не @Stepwise и это устанавливает _browser в ноль, как вы можете видеть здесь .
  8. YourSpec.cleanupSpec срабатывает ⇒ _browser равен null , если вы его не используете, поэтому он инициализируется
  9. GebSpec.cleanupSpec срабатывает ⇒ _browser все еще null
0 голосов
/ 07 ноября 2018

Кажется странным, что вы видите повторную инициализацию браузера для очистки, то, что вы показали, правильно.

Для пункта 1: вы устанавливаете его правильно в gebconfig.

Для пункта 2: Вам не нужно инициализировать браузер в setupSpec (), все, что вам нужно - это запись конфигурации.

Браузер должен автоматически закрываться после запуска всех тестов, ЕСЛИ ВЫ не добавили следующее в свой gebconfig и установили значение false:

quitCachedDriverOnShutdown = false 

setupSpec () вызывается после запуска всех методов в спецификации. То, что вы показали нам единственный код в вашей спецификации? Ваша спецификация расширяет GebSpec или GebReportingSpec или пользовательский базовый класс?

Единственное, что я могу подумать, это то, что у вас есть 2 теста в этой спецификации, так что вы видите «Созданный драйвер» дважды, и cleanUpSpec () вызывается после запуска всех тестов, поэтому вы видите, что он вызывается на конец. Если бы вы вызвали cleanup (), он запускался бы между каждым тестом.

...