我正在使用Selenide在w3schools.com上打开示例输入表单(找到here)。
测试在表单中输入一个名称,然后单击“提交”,然后在单独的选项卡/窗口中打开一个新页面,在div中显示请求参数。
以下是我的测试代码:
import com.codeborne.selenide.Configuration
import org.openqa.grid.internal.utils.configuration.StandaloneConfiguration
import org.openqa.selenium.remote.server.SeleniumServer
import spock.lang.Specification
import static com.codeborne.selenide.Condition.*
import static com.codeborne.selenide.Selectors.byName
import static com.codeborne.selenide.Selectors.byTitle
import static com.codeborne.selenide.Selenide.*
class DummyTest extends Specification {
def "Test w3schools form submit"() {
given: "Server setup configurations"
Configuration.browser = 'chrome'
StandaloneConfiguration configuration = new StandaloneConfiguration()
SeleniumServer server = new SeleniumServer(configuration)
server.boot()
when: "Name info is submitted into the form"
open("http://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()
// Maybe this will fix the erroneous element problem?
$(byTitle('HTML Forms')).waitUntil(disappears, 5000)
then: "New page should display the passed-in request params"
$x("/html/body/div[1]").shouldHave(text("firstname=Clark&lastname=Kent"))
}
}
...其中webdriver.chrome.driver
是一个传入的环境变量,指向chromedriver.exe
的正确位置。
测试会打开初始表单页面并正确输入名/姓。当它单击提交按钮时,它等待第二页加载并显示请求参数。
注意,无论我的waitUntil()
方法调用是否存在,都会发生错误。许多其他StackOverflow帖子建议做类似的事情来解决问题,尽管Selenide文档说我的shouldHave()
子句中的then
方法调用应该自动进行流畅的等待。
这是我的测试用例的输出:
Condition failed with Exception:
$x("/html/body/div[1]").shouldHave(text("firstname=Clark&lastname=Kent"))
| | |
| | text 'firstname=Clark&lastname=Kent'
| Element should have text 'firstname=Clark&lastname=Kent' {By.xpath: /html/body/div[1]}
| Element: '<div class="w3-container top">w3schools.com
| THE WORLD'S LARGEST WEB DEVELOPER SITE</div>'
| Screenshot: file:/C:/Workspace/IntelliJ/dummy-selenide-project/build/reports/tests/1498836183270.0.png
| Timeout: 4 s.
NoSuchElementException: no such element: Unable to locate element: {"method":"xpath","selector":"/html/body/div[1]"}
因此,很明显,根据测试输出,它抓住了初始页面的xPath,而不是第二页。
我有什么遗失或做错了吗?我是否需要为每个新页面实例化一个新对象?
答案 0 :(得分:0)
很难在文档中找到答案,但我在问题here中发现您需要调用方法来切换到另一个窗口。
您必须调用静态方法Selenide#switchTo()
,该方法返回SelenideTargetLocator
。在该对象上,您可以调用方法window()
,该方法采用基于0的索引(int
)或名称/句柄/标题(String
)。
因此,在我的switchTo()
子句中为我的Spock测试添加and
方法后,工作结果如下所示:
def "Test w3schools form submit"() {
given: "Server setup configurations"
Configuration.browser = 'chrome'
StandaloneConfiguration configuration = new StandaloneConfiguration()
SeleniumServer server = new SeleniumServer(configuration)
server.boot()
when: "Name info is submitted into the form"
open("http://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 window"
switchTo().window(1)
then: "New page should display the passed-in request params"
$x("/html/body/div[1]").shouldHave(text("firstname=Clark&lastname=Kent"))
}
注意:为了我的测试代码,由于测试只打开一个新标签,因此调用switchTo(1)
适用于Chrome,但请注意窗口/标签顺序可能是在其他浏览器中有所不同。