How to handle/accept JS Alerts in PhantomJS using

2019-05-06 15:38发布

问题:

Being new to PhantomJSDriver for Selenium, how does it handle JS alerts?

I've found the JSPhantom onAlert documentation, but what would the equivalent PhantomJSDriver code for

Driver.SwitchTo().Alert().Accept();

be?

At the moment, I've returning early with a guard clause for PhantomJSDriver, to stop exceptions, but how should js alerts in PhantomJS be interacted with?

回答1:

I had similar problems with PhantomJS Web Driver handling alerts. The below code seems to resolve the issue. This is a C# implementation but should work with Java too..

      public IAlert GetSeleniumAlert()
            {
                //Don't handle Alerts using .SwitchTo() for PhantomJS
                if (webdriver is PhantomJSDriver)
                {
                  var js = webdriver as IJavaScriptExecutor;

                 
                  var result = js.ExecuteScript("window.confirm = function(){return true;}") as string;
                    
                  ((PhantomJSDriver)webdriver).ExecutePhantomJS("var page = this;" +
                                                 "page.onConfirm = function(msg) {" +
                                                 "console.log('CONFIRM: ' + msg);return true;" +
                                                    "};");
                  return null;
                }

                try
                {
                    return webdriver.SwitchTo().Alert();
                }
                catch (NoAlertPresentException)
                {
                    return null;
                }
            }

And later in the code where you expect Alerts to occur

IAlert potentialAlert = GetSeleniumAlert();
                if (potentialAlert != null) //will always be null for PhantomJS
                {
                    //code to handle Alerts
                    IAlert alert=webDriver.SwitchTo().Alert();
                    alert.Accept();
                }

For PhantomJS, we are setting the default response to Alerts as accept.



回答2:

I don't think PhantomJS currently supports alert handling.

To simply accept alerts, (in Python/Splinter) try this for every reloaded page that would have an alert later.

driver.execute_script("window.confirm = function(){return true;}");

See more reference here.