Dismiss leave page dialogs automatically using Chromedriver (Codeception) - selenium-chromedriver

I have written a series of acceptance tests that work when executed independently. I am using ChromeDriver to carry out this tests with Codeception.
However, when I run all the procedures from a test class I get a dialog about
This page is asking you to confirm that you want to leave - data you have entered may not be saved.
This is a browser modal alert, hence all the tests that follow fail as the browser cannot navigate away from this page.
Is there an way in Codeception or Chromedriver to accept the dialog with default keys so that other tests can be performed sequentially? Or to tell Codeception to force close the current window and try a new window?
Thanks!

I found similar question for different test framework: Prevent onbeforeunload dialog from interfering with tests
Proposed solution is to execute window.onbeforeunload = undefined; after each page load.
With Codeception you have to use executeJS method:
$I->amOnPage('/');
$I->executeJS('window.onbeforeunload = undefined;');

After playing with settings for a while, the only way to get passed is to set the restart property to true (false by default):
WebDriver:
url: 'http://localhost:8080/'
wait: 2
window_size: false # disabled in ChromeDriver
port: 9515
browser: chrome
restart: true
This will close the browser window and the dialog will not be displayed. A new browser will be opened for the next test.
This solution will make the acceptance run tests even slow, so I'm keen to see if anyone else has a better solution!
Worth noting that I tried playing with the unexpectedAlertBehaviour capability and no matter what value I have it, the alert would not be dismissed.

You could inject jQuery to delete the confirmation box, I believe. (Disclaimer: Not a website coder).
Edit: I don't think that's viable.
See Remove Alert box before it pops up

Related

RenderDoc inject into Google chrome failing

Hi so I am trying to start chrome with white tab(no graphical api) following this Google maps to 3D model tutorial and part of it instructs to inject RenderDoc into Google chrome but the injection is failing
I'm suspecting that this is what is causing the injection to fail is that chrome is loading with graphical api involved:
I made a shortcut with Target in properties holding" C:\Windows\System32\cmd.exe /c "SET RENDERDOC_HOOK_EGL=0 && START "" ^"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe^" --no-sandbox --gpu-startup-dialog""
Using it opens this
But it should be like this
And can inject into it
But when I click the ok button in the pop up "GPU starts with pid: 2408" puts me out and when I try to reinject does this
Any idea how I can fix this?
Tried different versions of RenderDoc (1.17 and 1.24), running on cmd instead of shortcut and restarting machine.
I'm going crazy with this problem....
Chrome restart several times, before restarting I noticed injection success with upper status bar visible, but when chrome restart last time injection fails.
I suspect that chrome has a system to detect injection and try several methods to block it, until a new restarted gpu process has avoided it.
I'm actually searching in this direction to solve the problem (if I'm right).
Confimation of this : https://www.securityweek.com/chrome-block-apps-injecting-its-processes/
...So I'll try a chrome version before 72 of January 2019, when chrome try to blocks all injections...

How to manually disconnect webpack dev server from chrome

Can I manually disconnect a chrome window from refreshing automatically when I change my code.
Basically I want to disconnect the websocket connection using devtool or some other way. I tried offline checkbox, but its not helping.
This will come handy for a HTML developer for him to compare the HTML changes done from a developer tool and to the original one.
Right-click the WS connection in the Network panel then select Block Request URL. Based on the websocket.org echo demo, it seems to provide the effect you're looking for.
Have you tried setting the hot module reload to false? There is mention of it in the docs.

Watir Webdriver +Chromedriver: ADFS Authentication

I'm attempting to load a page that does a call to ADFS for authentication purposes. On the page load, there is a redirect and then popup to enter credentials.
HTTPS must be used.
Chrome must be used as the testing browser.
So, when loading the page everything is working fine, but I'm forced to manually enter credentials when running the test. After inputting the credentials everything is fine, but is there a way to leverage Watir to input this for me? I've tried popping the username:password into the link already with no success, and since I really need to use Chrome the Firefox plugins are moot.
require 'watir-webdriver'
b = Watir::Browser.new :chrome
b.goto 'https://internalUAT.clientwebsite.com/'
b.link(:text => 'HR Dashboard').click
I'm not allowed to post images due to reputation constraints, but please visit
https://i.imgur.com/ExVt8fp.png
for a screenshot.
When you try passing credentials with the https://user:pass#foo.com technique, do you have any unusual characters in the username or password? (Maybe you have a DOMAIN\username domain prefix?)
If so you might want to make sure any such characters in the credential string are properly escaped.
If that's not the problem, and there's no other way to disable the auth prompt for your tests, then your best bet (IMO) is to write a separate script (or thread) that uses RAutomation (or some other UI automation library of your choosing) to enter your credentials and click the Log In button.
See https://github.com/jarmo/RAutomation
The test cases in the following file contain examples of using RAutomation's send_keys method, which could prove useful:
https://github.com/jarmo/RAutomation/blob/master/spec/window_spec.rb
For the record, it looks like RAutomation may have been used by watir-classic for dialog handling:
https://github.com/watir/watir-classic/blob/master/lib/watir-classic/modal_dialog.rb
http://www.rubydoc.info/github/watir/watir-classic/Watir/ModalDialog

Is there any way to defer HTML5 manifest checking?

Given that there is a way to invoke an update directly using window.applicationCache.update(), is there any way to omit the update that is performed automatically by the browser when the page is loaded?
I've been experimenting with offline mode in Google Chrome, and so far it appears that
1) If a manifest file is specified, it will be loaded, and there is nothing I can do in JavaScript to stop it.
2) If the manifest file has changed, the entire cache is going to be updated, and there is nothing I can do to stop it.
In my experience, window.applicationCache.abort() has no effect regardless of when I invoke it. I've tried invoking it on the first line of javascript, and in the checking and downloading events, but it always downloads everything. It may have something to do with timing since the files are small and load very quickly.
Listen for the checking event and cancel it. The abort() method doesn't come into things until step 17 of the application cache download process, I don't think you're going to be able to stop the process with it.
This is a Chrome bug at the time of writing: https://code.google.com/p/chromium/issues/detail?id=175063 (please vote it up)
Just tried this on iOS Safari:
window.applicationCache.addEventListener('checking', function(event) {
window.applicationCache.abort();
}, false);
It works. In Safari debugger console:
Application Cache download process was aborted.
Chrome ignores the same code.

Can Google Chrome be made to auto reload after network outage in kiosk scenario?

I have an unattended touch screen kiosk application which needs to be able to automatically reload the browser home page after a network outage has occurred. At the moment the browser will display an "Unable to connect to the internet" error and will wait for a manual reload to be carried out before proceeding. Can this be automated?
I've searched for plugins and have found some plugins which deal with auto-reload but they don't seem to work in this context. I am guessing that the plugin is only active when a page is loaded so in this case with an error condition, perhaps the plugin is not active.
One alternative might be to override the error page which is displayed by Chrome but I don't know if this is possible. I could then instantiate a Javascript timer to try a reload every n seconds for example. Is this possible?
I saw a suggestion to use frames to allow the outer frame (which is never refreshed) to keep trying the loading of an inner frame but I'm not keen to use frames unless there is no alternative. I also saw a suggestion to use AJAX calls to check if the network was working before attempting a page load but this seems overkill if there is a way to correct the error only when it has occurred rather than pre-empt an error for every page load.
Host system is Windows 7 by the way. I'm keen to keep the browser running if possible rather than kill and create a new browser process.
If you don't want to tackle chrome extension development, you could wrap your site in an iframe, and then periodically refresh the iframe from the parent frame. That way you don't need to worry about OS issues.
if the content were loaded from ajax from the start then the it could simply output a custom message on the page as it does a check via AJAX. Probably prevention over remedy is always recommended
Assuming linux, you could create an ifup script to simply relaunch the browser with something like
#!/bin/sh
killall google-chrome
DISPLAY=:0 google-chrome
On debian/ubuntu, edit /etc/network/interfaces to include a post-up line; Google ifupdown for other distros.
On windows, you'd do roughly the same with a PowerShell script.
If you really want the precise behaviour you describe (without restarting the whole browser), I suggest you develop a plugin/extension: http://code.google.com/chrome/extensions/getstarted.html
I know you are using Chrome, but in Firefox this is trivial by overriding the netError.xhtml page to do a setTimeout(location.reload, 10000);.