我设置了一个Selenium Grid项目,可以在两个不同的浏览器Chrome和Firefox中执行我的测试。我正在使用Gradle来执行我的测试。测试将成功执行两次,一次在Chrome中,一次在Firefox中,如预期的那样,然后第三个实例将在默认浏览器中执行并失败。
geckodriver
),规范将会运行,并且会通过。geckodriver
),规范将会运行,并且会通过。firefoxdriver
),规范将无法运行,并且会失败。我之前遇到Gradle执行Spock测试两次的问题。为了解决这个问题,我不得不添加以下代码:
test {
actions = []
}
我还注意到,当我的Selenium测试再次执行时,它会使用默认的firefox
驱动程序打开它,而不是gecko
或marionette
驱动程序。
firefox
驱动程序已旧,并且不支持最新版本的Firefox,但它的Selenium"默认"浏览器,如果您没有指定浏览器来执行测试。我创建了一个示例项目,可以在Bitbucket上重现此问题。有关如何运行样本测试的说明包含在自述文件中。
作为一个片段,这是我的示例规范:
class W3SchoolsFormExampleSpec extends Specification {
def 'Test form submission is successful on W3Schools'() {
when: 'Name info is submitted into the form'
open('https://www.w3schools.com/html/html_forms.asp')
$(byName('firstname')).setValue('Clark')
$(byName('lastname')).setValue('Kent')
$x('//*[@id="main"]/div[3]/div/form/input[3]').click()
and: 'Switch to newly opened tab'
switchTo().window(1)
then: 'New page should display the passed-in request params'
$x('/html/body/div[1]').shouldHave(text('firstname=Clark&lastname=Kent'))
}
}
这是我build.gradle
文件的摘录:
test {
// Prevent Gradle from strangely executing Spock tests twice
actions = []
}
task testW3SchoolsForm(type: Test) {
outputs.upToDateWhen { false }
doFirst {
// Check to see that the Selenium drivers are installed
if (!file("C:/Selenium/chromedriver.exe").exists()) {
throw new GradleException(
'ERROR: Please install the web drivers in the correct location.'
)
}
// Register the hub
GridLauncherV3.main('-role', 'hub')
// Register the Chrome and Firefox nodes
GridLauncherV3.main('-role', 'node',
'-browser', 'broswerName=chrome,platform=WINDOWS',
'-hub', 'http://localhost:4444/grid/register',
'-port', '4446'
)
GridLauncherV3.main('-role', 'node',
'-browser', 'broswerName=firefox,platform=WINDOWS',
'-hub', 'http://localhost:4444/grid/register',
'-port', '4446'
)
}
}
enum BrowserType {
CHROME('chrome'),
FIREFOX('gecko')
def browserString
BrowserType(browserString) {
this.browserString = browserString
}
}
BrowserType.values().each { browserType ->
tasks.create("testW3SchoolsForm${browserType}", Test) {
// Force the tests to run every time
outputs.upToDateWhen { false }
// Allow parallel execution
maxParallelForks = 3
forkEvery = 0
def drivers = [
(BrowserType.CHROME): 'chromedriver.exe',
(BrowserType.FIREFOX): 'geckodriver.exe'
]
def browserProperty = browserType.browserString
def webdriverPath = file("C:/Selenium/${drivers[browserType]}")
// Set the respective system properties for each browser
systemProperties["webdriver.${browserProperty}.driver" as String] = webdriverPath
systemProperties['selenide.browser'] = browserType.browserString
filter {
include 'com/example/dummy/W3SchoolsFormExampleSpec.class'
}
testLogging {
events 'PASSED', 'FAILED', 'STARTED', 'SKIPPED'
}
testW3SchoolsForm.dependsOn "testW3SchoolsForm${browserType}"
}
}
关于为什么第三个测试实例会在默认的Selenium浏览器中执行的任何想法?
答案 0 :(得分:1)
经过几天的反复试验并通过Gradle forums发布解决方案后,我找出了原因,这可能有助于未来的读者。
Test
任务时要小心。默认情况下,应用Java
或Groovy
插件会自动创建默认Test
任务,该任务会执行test
源目录下的所有测试。
通过执行以下操作创建自定义测试任务时:
task testABC(type: Test) {
filter {
include "ABCTest"
}
}
...执行此测试任务也将执行默认的test
任务。如果您希望禁用默认test
任务的执行,请设置test.enabled = false
。