Website testing using table template and BrowserTest
On this page we test retrieving record details using AllMusic.
This test continues where ScenarioTest left of. It uses 'table template', a custom extension of Slim's scenario[?], to define a parameterized script. This is then invoked multiple times from a Decision table[?], once for each row. The advantage of this custom extension is that the scenario's parameters do not have to be listed in its first row (but only in the rows where they are used and in the decision table). This is, of course, especially convenient when there are many parameters. 'Table template' supports both input and output parameters, just like regular scenarios. Output parameters are indicated in the decision table by the fact that their column header ends with '?'.
The configuration of Selenium (i.e. which browser to use) and starting the browser session is done in the SuiteSetup[?]. Which allows this configuration to be shared between tests. Closing the browser is done in SuiteTearDown, which happens after all tests are completed.
First we go to the Discography page for Van Morrison.
script | browser test org.openqa.selenium.TimeoutException: timeout: Timed out receiving message from renderer: -0.001 (Session info: chrome=80.0.3987.87) (Driver info: chromedriver=80.0.3987.16 (320f6526c1632ad4f205ebce69b99a062ed78647-refs/branch-heads/3987@{#185}),platform=Windows NT 10.0.10586 x86_64) (WARNING: The server did not provide any stacktrace information) Command duration or timeout: 0 milliseconds Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03' System info: host: 'localhost', ip: '127.0.0.1', os.name: 'Linux', os.arch: 'amd64', os.version: '4.15.0-1055-gcp', java.version: '1.8.0_242' Driver info: org.openqa.selenium.remote.RemoteWebDriver Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 80.0.3987.16 (320f6526c1632..., userDataDir: C:\Users\ADMINI~1\AppData\L...}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:49760}, handlesAlerts: true, hasMetadata: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: WINDOWS, platformName: WINDOWS, proxy: Proxy(), rotatable: false, setWindowRect: true, strictFileInteractability: false, takesHeapSnapshot: true, takesScreenshot: true, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unexpectedAlertBehaviour: ignore, unhandledPromptBehavior: ignore, version: 80.0.3987.87, webStorageEnabled: true, webdriver.remote.sessionid: 74ed0e4e6eb242638abd370a507...} Session ID: 74ed0e4e6eb242638abd370a507c4669 | ||
set continue if ready state interactive No Method setContinueIfReadyStateInteractive[1] in class nl.hsac.fitnesse.fixture.slim.web.LayoutTest. Available methods: addValueTo(java.lang.Object, java.lang.String) -> void aroundSlimInvoke(fitnesse.slim.fixtureInteraction.FixtureInteraction, java.lang.reflect.Method, java.lang.Object[]) -> class java.lang.Object clearValue(java.lang.String) -> boolean clearValues() -> void copyValuesFrom(java.util.Map) -> void equals(java.lang.Object) -> boolean excludedTags() -> interface java.util.List expandPeriodsInNamesToNestedMaps(boolean) -> void expandsPeriodsInNamesToNestedMaps() -> boolean getClass() -> class java.lang.Class getMapHelper() -> class nl.hsac.fitnesse.fixture.util.MapHelper getOverallReportLink() -> class java.lang.String globalValue(java.lang.String) -> class java.lang.String hashCode() -> int includedTags() -> interface java.util.List layoutCheckMessages() -> class java.lang.Object notify() -> void notifyAll() -> void passedSpecCount() -> int repeatAtMostTimes() -> int repeatAtMostTimes(int) -> void repeatCount() -> int repeatInterval() -> long reset() -> void set(java.lang.String, java.lang.Object) -> void setBase64EncodedContentOfAsValueFor(java.lang.String, java.lang.String) -> void setBooleanValueFor(boolean, java.lang.String) -> void setContentOfAsValueFor(java.lang.String, java.lang.String) -> void setDoubleValueFor(double, java.lang.String) -> void setExcludedTags(java.util.List) -> void setGlobalValueTo(java.lang.String, java.lang.String) -> void setIncludedTags(java.util.List) -> void setIntValueFor(int, java.lang.String) -> void setLayoutCheckName(java.lang.String) -> void setMapHelper(nl.hsac.fitnesse.fixture.util.MapHelper) -> void setRepeatIntervalToMilliseconds(int) -> void setValueFor(java.lang.Object, java.lang.String) -> void setValuesFor(java.lang.String, java.lang.String) -> void specErrorCount() -> int specWarningCount() -> int timeSpentRepeating() -> long toString() -> class java.lang.String value(java.lang.String) -> class java.lang.Object verifiedSpecCount() -> int verifyLayoutUsing(java.lang.String) -> class java.lang.String wait() -> void wait(long) -> void wait(long, int) -> void waitMilliseconds(int) -> boolean waitSeconds(int) -> boolean | true | ||
open No Method open[1] in class nl.hsac.fitnesse.fixture.slim.web.LayoutTest. Available methods: addValueTo(java.lang.Object, java.lang.String) -> void aroundSlimInvoke(fitnesse.slim.fixtureInteraction.FixtureInteraction, java.lang.reflect.Method, java.lang.Object[]) -> class java.lang.Object clearValue(java.lang.String) -> boolean clearValues() -> void copyValuesFrom(java.util.Map) -> void equals(java.lang.Object) -> boolean excludedTags() -> interface java.util.List expandPeriodsInNamesToNestedMaps(boolean) -> void expandsPeriodsInNamesToNestedMaps() -> boolean getClass() -> class java.lang.Class getMapHelper() -> class nl.hsac.fitnesse.fixture.util.MapHelper getOverallReportLink() -> class java.lang.String globalValue(java.lang.String) -> class java.lang.String hashCode() -> int includedTags() -> interface java.util.List layoutCheckMessages() -> class java.lang.Object notify() -> void notifyAll() -> void passedSpecCount() -> int repeatAtMostTimes() -> int repeatAtMostTimes(int) -> void repeatCount() -> int repeatInterval() -> long reset() -> void set(java.lang.String, java.lang.Object) -> void setBase64EncodedContentOfAsValueFor(java.lang.String, java.lang.String) -> void setBooleanValueFor(boolean, java.lang.String) -> void setContentOfAsValueFor(java.lang.String, java.lang.String) -> void setDoubleValueFor(double, java.lang.String) -> void setExcludedTags(java.util.List) -> void setGlobalValueTo(java.lang.String, java.lang.String) -> void setIncludedTags(java.util.List) -> void setIntValueFor(int, java.lang.String) -> void setLayoutCheckName(java.lang.String) -> void setMapHelper(nl.hsac.fitnesse.fixture.util.MapHelper) -> void setRepeatIntervalToMilliseconds(int) -> void setValueFor(java.lang.Object, java.lang.String) -> void setValuesFor(java.lang.String, java.lang.String) -> void specErrorCount() -> int specWarningCount() -> int timeSpentRepeating() -> long toString() -> class java.lang.String value(java.lang.String) -> class java.lang.Object verifiedSpecCount() -> int verifyLayoutUsing(java.lang.String) -> class java.lang.String wait() -> void wait(long) -> void wait(long, int) -> void waitMilliseconds(int) -> boolean waitSeconds(int) -> boolean | https://www.allmusic.com | ||
show No Method clickIfAvailable[1] in class nl.hsac.fitnesse.fixture.slim.web.LayoutTest. Available methods: addValueTo(java.lang.Object, java.lang.String) -> void aroundSlimInvoke(fitnesse.slim.fixtureInteraction.FixtureInteraction, java.lang.reflect.Method, java.lang.Object[]) -> class java.lang.Object clearValue(java.lang.String) -> boolean clearValues() -> void copyValuesFrom(java.util.Map) -> void equals(java.lang.Object) -> boolean excludedTags() -> interface java.util.List expandPeriodsInNamesToNestedMaps(boolean) -> void expandsPeriodsInNamesToNestedMaps() -> boolean getClass() -> class java.lang.Class getMapHelper() -> class nl.hsac.fitnesse.fixture.util.MapHelper getOverallReportLink() -> class java.lang.String globalValue(java.lang.String) -> class java.lang.String hashCode() -> int includedTags() -> interface java.util.List layoutCheckMessages() -> class java.lang.Object notify() -> void notifyAll() -> void passedSpecCount() -> int repeatAtMostTimes() -> int repeatAtMostTimes(int) -> void repeatCount() -> int repeatInterval() -> long reset() -> void set(java.lang.String, java.lang.Object) -> void setBase64EncodedContentOfAsValueFor(java.lang.String, java.lang.String) -> void setBooleanValueFor(boolean, java.lang.String) -> void setContentOfAsValueFor(java.lang.String, java.lang.String) -> void setDoubleValueFor(double, java.lang.String) -> void setExcludedTags(java.util.List) -> void setGlobalValueTo(java.lang.String, java.lang.String) -> void setIncludedTags(java.util.List) -> void setIntValueFor(int, java.lang.String) -> void setLayoutCheckName(java.lang.String) -> void setMapHelper(nl.hsac.fitnesse.fixture.util.MapHelper) -> void setRepeatIntervalToMilliseconds(int) -> void setValueFor(java.lang.Object, java.lang.String) -> void setValuesFor(java.lang.String, java.lang.String) -> void specErrorCount() -> int specWarningCount() -> int timeSpentRepeating() -> long toString() -> class java.lang.String value(java.lang.String) -> class java.lang.Object verifiedSpecCount() -> int verifyLayoutUsing(java.lang.String) -> class java.lang.String wait() -> void wait(long) -> void wait(long, int) -> void waitMilliseconds(int) -> boolean waitSeconds(int) -> boolean | click if available | I accept | |
enter No Method enterAs[2] in class nl.hsac.fitnesse.fixture.slim.web.LayoutTest. Available methods: addValueTo(java.lang.Object, java.lang.String) -> void aroundSlimInvoke(fitnesse.slim.fixtureInteraction.FixtureInteraction, java.lang.reflect.Method, java.lang.Object[]) -> class java.lang.Object clearValue(java.lang.String) -> boolean clearValues() -> void copyValuesFrom(java.util.Map) -> void equals(java.lang.Object) -> boolean excludedTags() -> interface java.util.List expandPeriodsInNamesToNestedMaps(boolean) -> void expandsPeriodsInNamesToNestedMaps() -> boolean getClass() -> class java.lang.Class getMapHelper() -> class nl.hsac.fitnesse.fixture.util.MapHelper getOverallReportLink() -> class java.lang.String globalValue(java.lang.String) -> class java.lang.String hashCode() -> int includedTags() -> interface java.util.List layoutCheckMessages() -> class java.lang.Object notify() -> void notifyAll() -> void passedSpecCount() -> int repeatAtMostTimes() -> int repeatAtMostTimes(int) -> void repeatCount() -> int repeatInterval() -> long reset() -> void set(java.lang.String, java.lang.Object) -> void setBase64EncodedContentOfAsValueFor(java.lang.String, java.lang.String) -> void setBooleanValueFor(boolean, java.lang.String) -> void setContentOfAsValueFor(java.lang.String, java.lang.String) -> void setDoubleValueFor(double, java.lang.String) -> void setExcludedTags(java.util.List) -> void setGlobalValueTo(java.lang.String, java.lang.String) -> void setIncludedTags(java.util.List) -> void setIntValueFor(int, java.lang.String) -> void setLayoutCheckName(java.lang.String) -> void setMapHelper(nl.hsac.fitnesse.fixture.util.MapHelper) -> void setRepeatIntervalToMilliseconds(int) -> void setValueFor(java.lang.Object, java.lang.String) -> void setValuesFor(java.lang.String, java.lang.String) -> void specErrorCount() -> int specWarningCount() -> int timeSpentRepeating() -> long toString() -> class java.lang.String value(java.lang.String) -> class java.lang.Object verifiedSpecCount() -> int verifyLayoutUsing(java.lang.String) -> class java.lang.String wait() -> void wait(long) -> void wait(long, int) -> void waitMilliseconds(int) -> boolean waitSeconds(int) -> boolean | Van Morrison | as | Search |
press No Method press[1] in class nl.hsac.fitnesse.fixture.slim.web.LayoutTest. Available methods: addValueTo(java.lang.Object, java.lang.String) -> void aroundSlimInvoke(fitnesse.slim.fixtureInteraction.FixtureInteraction, java.lang.reflect.Method, java.lang.Object[]) -> class java.lang.Object clearValue(java.lang.String) -> boolean clearValues() -> void copyValuesFrom(java.util.Map) -> void equals(java.lang.Object) -> boolean excludedTags() -> interface java.util.List expandPeriodsInNamesToNestedMaps(boolean) -> void expandsPeriodsInNamesToNestedMaps() -> boolean getClass() -> class java.lang.Class getMapHelper() -> class nl.hsac.fitnesse.fixture.util.MapHelper getOverallReportLink() -> class java.lang.String globalValue(java.lang.String) -> class java.lang.String hashCode() -> int includedTags() -> interface java.util.List layoutCheckMessages() -> class java.lang.Object notify() -> void notifyAll() -> void passedSpecCount() -> int repeatAtMostTimes() -> int repeatAtMostTimes(int) -> void repeatCount() -> int repeatInterval() -> long reset() -> void set(java.lang.String, java.lang.Object) -> void setBase64EncodedContentOfAsValueFor(java.lang.String, java.lang.String) -> void setBooleanValueFor(boolean, java.lang.String) -> void setContentOfAsValueFor(java.lang.String, java.lang.String) -> void setDoubleValueFor(double, java.lang.String) -> void setExcludedTags(java.util.List) -> void setGlobalValueTo(java.lang.String, java.lang.String) -> void setIncludedTags(java.util.List) -> void setIntValueFor(int, java.lang.String) -> void setLayoutCheckName(java.lang.String) -> void setMapHelper(nl.hsac.fitnesse.fixture.util.MapHelper) -> void setRepeatIntervalToMilliseconds(int) -> void setValueFor(java.lang.Object, java.lang.String) -> void setValuesFor(java.lang.String, java.lang.String) -> void specErrorCount() -> int specWarningCount() -> int timeSpentRepeating() -> long toString() -> class java.lang.String value(java.lang.String) -> class java.lang.Object verifiedSpecCount() -> int verifyLayoutUsing(java.lang.String) -> class java.lang.String wait() -> void wait(long) -> void wait(long, int) -> void waitMilliseconds(int) -> boolean waitSeconds(int) -> boolean | enter | ||
click No Method click[1] in class nl.hsac.fitnesse.fixture.slim.web.LayoutTest. Available methods: addValueTo(java.lang.Object, java.lang.String) -> void aroundSlimInvoke(fitnesse.slim.fixtureInteraction.FixtureInteraction, java.lang.reflect.Method, java.lang.Object[]) -> class java.lang.Object clearValue(java.lang.String) -> boolean clearValues() -> void copyValuesFrom(java.util.Map) -> void equals(java.lang.Object) -> boolean excludedTags() -> interface java.util.List expandPeriodsInNamesToNestedMaps(boolean) -> void expandsPeriodsInNamesToNestedMaps() -> boolean getClass() -> class java.lang.Class getMapHelper() -> class nl.hsac.fitnesse.fixture.util.MapHelper getOverallReportLink() -> class java.lang.String globalValue(java.lang.String) -> class java.lang.String hashCode() -> int includedTags() -> interface java.util.List layoutCheckMessages() -> class java.lang.Object notify() -> void notifyAll() -> void passedSpecCount() -> int repeatAtMostTimes() -> int repeatAtMostTimes(int) -> void repeatCount() -> int repeatInterval() -> long reset() -> void set(java.lang.String, java.lang.Object) -> void setBase64EncodedContentOfAsValueFor(java.lang.String, java.lang.String) -> void setBooleanValueFor(boolean, java.lang.String) -> void setContentOfAsValueFor(java.lang.String, java.lang.String) -> void setDoubleValueFor(double, java.lang.String) -> void setExcludedTags(java.util.List) -> void setGlobalValueTo(java.lang.String, java.lang.String) -> void setIncludedTags(java.util.List) -> void setIntValueFor(int, java.lang.String) -> void setLayoutCheckName(java.lang.String) -> void setMapHelper(nl.hsac.fitnesse.fixture.util.MapHelper) -> void setRepeatIntervalToMilliseconds(int) -> void setValueFor(java.lang.Object, java.lang.String) -> void setValuesFor(java.lang.String, java.lang.String) -> void specErrorCount() -> int specWarningCount() -> int timeSpentRepeating() -> long toString() -> class java.lang.String value(java.lang.String) -> class java.lang.Object verifiedSpecCount() -> int verifyLayoutUsing(java.lang.String) -> class java.lang.String wait() -> void wait(long) -> void wait(long, int) -> void waitMilliseconds(int) -> boolean waitSeconds(int) -> boolean | Van Morrison | ||
click No Method click[1] in class nl.hsac.fitnesse.fixture.slim.web.LayoutTest. Available methods: addValueTo(java.lang.Object, java.lang.String) -> void aroundSlimInvoke(fitnesse.slim.fixtureInteraction.FixtureInteraction, java.lang.reflect.Method, java.lang.Object[]) -> class java.lang.Object clearValue(java.lang.String) -> boolean clearValues() -> void copyValuesFrom(java.util.Map) -> void equals(java.lang.Object) -> boolean excludedTags() -> interface java.util.List expandPeriodsInNamesToNestedMaps(boolean) -> void expandsPeriodsInNamesToNestedMaps() -> boolean getClass() -> class java.lang.Class getMapHelper() -> class nl.hsac.fitnesse.fixture.util.MapHelper getOverallReportLink() -> class java.lang.String globalValue(java.lang.String) -> class java.lang.String hashCode() -> int includedTags() -> interface java.util.List layoutCheckMessages() -> class java.lang.Object notify() -> void notifyAll() -> void passedSpecCount() -> int repeatAtMostTimes() -> int repeatAtMostTimes(int) -> void repeatCount() -> int repeatInterval() -> long reset() -> void set(java.lang.String, java.lang.Object) -> void setBase64EncodedContentOfAsValueFor(java.lang.String, java.lang.String) -> void setBooleanValueFor(boolean, java.lang.String) -> void setContentOfAsValueFor(java.lang.String, java.lang.String) -> void setDoubleValueFor(double, java.lang.String) -> void setExcludedTags(java.util.List) -> void setGlobalValueTo(java.lang.String, java.lang.String) -> void setIncludedTags(java.util.List) -> void setIntValueFor(int, java.lang.String) -> void setLayoutCheckName(java.lang.String) -> void setMapHelper(nl.hsac.fitnesse.fixture.util.MapHelper) -> void setRepeatIntervalToMilliseconds(int) -> void setValueFor(java.lang.Object, java.lang.String) -> void setValuesFor(java.lang.String, java.lang.String) -> void specErrorCount() -> int specWarningCount() -> int timeSpentRepeating() -> long toString() -> class java.lang.String value(java.lang.String) -> class java.lang.Object verifiedSpecCount() -> int verifyLayoutUsing(java.lang.String) -> class java.lang.String wait() -> void wait(long) -> void wait(long, int) -> void waitMilliseconds(int) -> boolean waitSeconds(int) -> boolean | Discography |
Then we check some entries.
table template | album details | |||||
scroll to | @{album} | |||||
$year= | value of | Year | in row where | Album | is | @{album} |
$label= | value of | Label | in row where | Album | is | @{album} |
album details | ||||||||||||||||||||||||||||||
album | year? | label? | ||||||||||||||||||||||||||||
Astral Weeks | 1968 Test not run | Warner Bros. Test not run | ||||||||||||||||||||||||||||
| ||||||||||||||||||||||||||||||
Moondance | 1970 Test not run | Rhino / Warner Bros. Test not run | ||||||||||||||||||||||||||||
|
To make test more readable, maintainable and powerful we can also create custom subclasses of BrowserTest. This is shown in CustomFixtureTest.