win32 and javascript alerts
Dave Brueck
dave at pythonapocrypha.com
Thu Oct 17 15:30:06 EDT 2002
On 17 Oct 2002, Bryan L. Fordham wrote:
> I'm using those nifty win32com extensions to do some unit testing.
> I'm able to control IE with no problems, fill out forms and push the
> pretty buttons to make things go.
>
> The one issue I've run into is this: Say there's an input box called
> Spam, that requires a value. If you click the Go button and Spam is
> empty, a little javascript alert box pops up and says "Hey, fill in
> Spam!"
>
> well, if I load the page using python and click the Go button with
> Spam empty, the javascript alert pops up... and I don't know how to
> get rid of it. Python hangs until I manually clear the alert.
>
> Any ways around this?
Well, the way I get around this feels like a horrible, horrible hack, but
it works pretty well. Below is some code from a class I made called
WebSerf.
Use the code in CaptureWindowEvents to install new window.alert and
window.open functions (I call this method after I click a Submit button,
click a link, or navigate to a whole new page - be sure the new document
has fully loaded first!).
The code in GetLatestAlertMessage and GetLatestOpenString let you see what
actions the page tried to take.
You'll have to modify the code somewhat to work with your approach,
but I hope it at least helps in some way.
-Dave
The code:
CAPTURE_JSCRIPT = '''var serfcapturedevents = 1;
var serfalertmsg="";
var serfopenwin=null;
function serfalert(arg) { serfalertmsg=arg; }
var serfcapturedevents = 1;
var serfalertmsg="";
var serfopenwin=null;
function serfalert(arg) { serfalertmsg=arg; }
function serfopen()
{
var args = new Array(null, null, null, null);
fargs = serfopen.arguments;
for (i=0; i < fargs.length; i++)
args[i] = fargs[i];
serfopenwin = serfoldwindowopen(args[0], args[1], args[2], args[3]);
return serfopenwin;
}
function serfclosepopup()
{ if (serfopenwin != null)
serfopenwin.close();
}
window.attachEvent('onunload', serfclosepopup);
window.alert=serfalert;
serfoldwindowopen = window.open;
window.open=serfopen;
var serfpromptvalue = '';
function serfprompt() { return serfpromptvalue; }
window.prompt = serfprompt;
var serfconfirmvalue = true;
function serfconfirm() { return serfconfirmvalue; }
window.confirm = serfconfirm;'''
Now a few methods from the WebSerf class:
def CaptureWindowEvents(self):
'Installs a Javascript routine to reroute any window.alert/.open
calls'
pw = self.doc.parentWindow
try:
pw.serfcapturedevents
return # Already captured
except AttributeError:
pass # Ok, now go capture them
try:
pw.execScript(CAPTURE_JSCRIPT)
except:
traceback.print_exc()
def GetLatestAlertMsg(self):
'Returns and clears the most recent window.alert message'
try:
pw = self.doc.parentWindow
msg = pw.serfalertmsg
if msg:
pw.serfalertmsg = ''
except:
msg = ''
traceback.print_exc()
return msg
def GetLatestOpenString(self):
'Returns and clears the most recent window.open string or None'
try:
pw = self.doc.parentWindow
win = pw.serfopenwin
if win:
pw.serfopenwin = None
except:
win = None
traceback.print_exc()
return win
More information about the Python-list
mailing list