如何在Safari上处理Selenium .click()方法?

时间:2019-03-27 11:02:19

标签: java selenium safari

因此,我正在测试该网站,并且在Safari上运行自动化测试时,驱动程序实例化没有问题,我指定运行代码的基本URL被命中,但是当我尝试单击任何内容时,链接,按钮或其他任何内容,浏览器就停在那里,看上去很困惑。

在Chrome,Firefox或Opera上,在Safari上,我都没有这个问题。

当代码到达.click()方法时,它只是停止并且不再执行任何操作。

有人可以帮我吗?

如何通过单击元素来处理Safari问题?

@Test
public void NEmptyEmail()
    {
        RegisterPage register = new RegisterPage(driver);

        register.registerPageLink().click();

        register.email().sendKeys("");
        register.submit().click();

        driver.findElement(By.xpath("//*[@id=\"root\"]/main/div/section[1]/div/div/div/div/div/form/div[1]/div/div[1]/div/label[2]")).isDisplayed();
    }

下面的堆栈跟踪:

org.openqa.selenium.WebDriverException: 
Build info: version: '3.141.59', revision: 'e82be7d358', time: '2018-11-14T08:17:03'
System info: host: 'Andreis-iMac.local', os.name: 'Mac OS X', os.arch: 'x86_64', os.version: '10.14.3', java.version: '11.0.2'
Driver info: org.openqa.selenium.safari.SafariDriver
Capabilities {acceptInsecureCerts: false, browserName: Safari, browserVersion: 12.0.3, javascriptEnabled: true, platform: MAC, platformName: MAC, setWindowRect: true}
Session ID: 46FF6974-517C-448F-AD58-16F01177B898
*** Element info: {Using=xpath, value=//*[@id="root"]/main/div/section[1]/div/div/div/div/div/form/div[1]/div/div[1]/div/div/input}

    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
    at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
    at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.createException(W3CHttpResponseCodec.java:187)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:122)
    at org.openqa.selenium.remote.http.W3CHttpResponseCodec.decode(W3CHttpResponseCodec.java:49)
    at org.openqa.selenium.remote.HttpCommandExecutor.execute(HttpCommandExecutor.java:158)
    at org.openqa.selenium.remote.service.DriverCommandExecutor.execute(DriverCommandExecutor.java:83)
    at org.openqa.selenium.remote.RemoteWebDriver.execute(RemoteWebDriver.java:552)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:323)
    at org.openqa.selenium.remote.RemoteWebDriver.findElementByXPath(RemoteWebDriver.java:428)
    at org.openqa.selenium.By$ByXPath.findElement(By.java:353)
    at org.openqa.selenium.remote.RemoteWebDriver.findElement(RemoteWebDriver.java:315)
    at pageObjects.RegisterPage.email(RegisterPage.java:38)
    at RegisterPageTests.NEmptyEmail(RegisterPageTests.java:48)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.base/java.lang.reflect.Method.invoke(Method.java:566)
    at org.testng.internal.MethodInvocationHelper.invokeMethod(MethodInvocationHelper.java:124)
    at org.testng.internal.Invoker.invokeMethod(Invoker.java:583)
    at org.testng.internal.Invoker.invokeTestMethod(Invoker.java:719)
    at org.testng.internal.Invoker.invokeTestMethods(Invoker.java:989)
    at org.testng.internal.TestMethodWorker.invokeTestMethods(TestMethodWorker.java:125)
    at org.testng.internal.TestMethodWorker.run(TestMethodWorker.java:109)
    at org.testng.TestRunner.privateRun(TestRunner.java:648)
    at org.testng.TestRunner.run(TestRunner.java:505)
    at org.testng.SuiteRunner.runTest(SuiteRunner.java:455)
    at org.testng.SuiteRunner.runSequentially(SuiteRunner.java:450)
    at org.testng.SuiteRunner.privateRun(SuiteRunner.java:415)
    at org.testng.SuiteRunner.run(SuiteRunner.java:364)
    at org.testng.SuiteRunnerWorker.runSuite(SuiteRunnerWorker.java:52)
    at org.testng.SuiteRunnerWorker.run(SuiteRunnerWorker.java:84)
    at org.testng.TestNG.runSuitesSequentially(TestNG.java:1208)
    at org.testng.TestNG.runSuitesLocally(TestNG.java:1137)
    at org.testng.TestNG.runSuites(TestNG.java:1049)
    at org.testng.TestNG.run(TestNG.java:1017)
    at org.testng.IDEARemoteTestNG.run(IDEARemoteTestNG.java:73)
    at org.testng.RemoteTestNGStarter.main(RemoteTestNGStarter.java:123)

2 个答案:

答案 0 :(得分:0)

通过stacktrace,点击没有问题。

at pageObjects.RegisterPage.email(RegisterPage.java:38)

register.email().sendKeys("");

导致org.openqa.selenium.WebDriverException

加载登录页面后,光标是否在“电子邮件”输入字段中(尝试在其他浏览器中手动加载页面)?如果没有,那么这辛苦的工作:

@Test
public void NEmptyEmail()
    {
        RegisterPage register = new RegisterPage(driver);

        register.registerPageLink().click();

        // click to the input field before sending keys
        register.email().click();

        register.email().sendKeys("");
        register.submit().click();

        driver.findElement(By.xpath("//*[@id=\"root\"]/main/div/section[1]/div/div/div/div/div/form/div[1]/div/div[1]/div/label[2]")).isDisplayed();
    }

答案 1 :(得分:0)

经过进一步调查,由于上面的回答帮助我看到了问题中解释的有关Safari的问题,因此我发现当您尝试使用空String进行.sendkeys(“”)时,Safari无法理解,从而使测试失败;

当我尝试使用一些文本.sendkeys(“ test”)时,浏览器会识别输入,然后将其与代码一同显示。

无论如何,就我而言,从上面的角度来看,我发现发送一个空字符串对于我来说有点多余,因为我正在研究登录表单的验证。

我的想法是我不需要发送空字符串,只需要在输入字段为空的情况下单击“登录”按钮即可。