【问题标题】:Unable to handle alert using phantomJS in Java无法在 Java 中使用 phantomJS 处理警报
【发布时间】:2017-05-14 15:51:37
【问题描述】:

我有一个如下的 Java 代码,当我通过 PhantomJs 运行时出现“不支持的命令异常”,但如果我通过 firefox 和 chrome 运行它就可以正常工作:-

注意:使用 phantomJs,我们可以在下面的代码中执行到第三步。我在许多博客中进行了搜索,但这些答案并没有解决我的问题。

1.      cvvField.sendKeys(cvcData);
2.      proceedToPayBtn.click();
3.      Reporter.log("Card details are submitted from payment UI page");
4.      Alert a1=driver.switchTo().alert();
5.      Reporter.log("Alert with text:"+a1.getText());
6.      a1.accept();   

这里的cvvField 和proceedToPayBtn 是WebElements,cvcData 的值为“111”。

错误日志:-

org.openqa.selenium.UnsupportedCommandException: Invalid Command Method - 

{"headers":{"Accept-Encoding":"gzip,deflate","Cache-Control":"no-cache","Connection":"Keep-Alive","Host":"localhost:30462","User-Agent":"Apache-HttpClient/4.5.1 (Java/1.8.0_101)"},"httpVersion":"1.1","method":"GET","url":"/alert_text","urlParsed":{"anchor":"","query":"","file":"alert_text","directory":"/","path":"/alert_text","relative":"

/alert_text","port":"","host":"","password":"","user":"","userInfo":"","authority":"","protocol":"","source":"/alert_text","queryKey":{},"chunks":["alert_text"]},"urlOriginal":"/session/9e392a50-ce79-11e6-b24a-2b12cf1ec4d6/alert_text"}

命令持续时间或超时:31 milliseconds

我已经编辑了上面的代码,但同样的错误来了。请建议

 if (driver instanceof PhantomJSDriver)
       {
         JavascriptExecutor je = (JavascriptExecutor) driver; 
         je.executeScript("window.alert = function(){};");
         je.executeScript("window.confirm = function(){return true;};");    
         System.out.println("Alert has been handled");
       } else {
             Alert a1 = driver.switchTo().alert();
             a1.accept();
       }                        

我在输出控制台中收到“已处理警报”,但未处理警报。

【问题讨论】:

标签: java selenium phantomjs ghostdriver


【解决方案1】:

由于等待时间导致的某些问题可能是问题的根源 上面的代码可以帮助等待元素可见(因为 ngWebDriver 或 Selenium Webdriver 的等待与 PhantomJS 不兼容)

public static String waitJSResponse(PhantomJSDriver driver, String script) {
        String ReturnedValue = null;
        int sleeper = 10;
        Boolean flag = false;
        int timeOut = 30000;
        int i = 0;
        while ((!flag) & ((i*sleeper)<timeOut)) {
            try {
                Thread.sleep(sleeper);
                ReturnedValue = (String) driver.executeScript(script);

            } catch (Exception e) {
                flag = false;
                i++;
            }
            if (ReturnedValue != null) {
                flag = true;
                System.out.println("Overall wait time is : "+(i * sleeper)+" ms \n\r");
                break;
            }
        }
        return ReturnedValue;
    }

这段代码会等待10ms然后验证元素是否可见,如果有异常会再次循环。 返回值必须是文本、对象或任何非空值。 脚本值必须是您的 JS 脚本才能获取正确的元素。

希望它有效。

我通过以下方式尝试了上面的代码:-

1.创建一个“Test”类并在其中编写上述方法。 2.上面的方法是通过创建一个对象(TestObject)来调用的

TestObject.waitJSResponse((PhantomJSDriver) 驱动,“window.confirm = function(){return true;};”);

但 ReturnedValue 在

try {
Thread.sleep(sleeper); ReturnedValue = (String) driver.executeScript(script); System.out.println(ReturnedValue);

}

返回 null。所以你能帮忙吗?

【讨论】:

  • 我回复了我的反馈。请提出您宝贵的建议。
  • 你不需要做一个 Thread.sleep(sleeper),只需将 waitJSResponse 作为一个函数添加,然后将你想要的脚本放入参数中,在我的代码中尝试过它就可以了跨度>
  • 谢谢@Hamza Amami。你能帮我解决这个问题吗stackoverflow.com/questions/41503733/…
  • 欢迎,我试试
  • 我无法接受警报。删除 Thread.sleepe(sleeper) 后它仍然返回 null 值。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-12-21
  • 1970-01-01
  • 1970-01-01
  • 2012-01-04
相关资源
最近更新 更多