Hallo,
ich möchte per JavaScript die Bedienung einer bestehenden Webanwendung (HTML-Seiten) automatisieren.
Dazu möchte ich die Werte einiger Steuerelemente (Textfelder, Tabellenzellen, etc.) auslesen, Werte in Steuerelemente (z.B. in Textfelder) eintragen und dann durch automatisches Betätigen eines Schalters neue HTML-Seiten laden und dort in Abhängigkeit den vorherigen Eingaben neue Eingaben automatisiert tätigen. Es soll so etwas ähnliches wie ein Testtool werden.
Die Webanwendung soll unverändert bleiben. Ich habe mir hierzu schon Tools wie „selenium“ angesehen. Diese helfen aber nicht richtig weiter.
Bisher habe ich es geschafft per JavaScript auf eine HTML-Seite und deren Steuerelemente zuzugreifen. Ich kann Werte auslesen, setzten und auch eine neue Seite aufrufen bzw. die Seite neu laden.
Mein Script soll jedoch über mehrere Seiten bzw. über mehrere Aufrufe einer Seite (wenn in Abhängigkeit der Eingaben neue Daten nachgeladen werden müssen) laufen.
Und hier beginnt mein Problem.
Ich kriege es nicht hin, mein Script solange anzuhalten, bis die neue Seite geladen ist bzw. die benötigten Daten nachgeladen sind und dann die Ausführung des Scriptes fortzuführen.
Also in etwa :
lese Wert aus Textfeld 1
ergänze Wert um xyz setzte Wert in Textfeld 1
betätige Schalter „suche Daten gemäß Eingabe aus Textfeld 1“
warte bis Seite neu geladen wurde
[Seite wird neu geladen mit Ergebnis der Suche in Abhängigkeit der Eingabe im Textfeld 1]
lese Werte aus Tabelle aus
vergleiche Werte mit Vorgabe
wiederhole mit anderen Werten
Ich habe versucht nach dem Betätigen des Schalters, der das erneute Laden der Seite auslöst, in Abständen von 2 Sekunden zu prüfen, ob die Seite erneut geladen wurde (delay, while (document.readyState != "complete")), jedoch scheint JS nur im single-thread zu arbeiten, so dass die Seite nicht geladen wird und statt dessen das Script endlos ausgeführt wird.
Auch habe ich schon an „setTimeout“ bzw. „setIntervall“ gedacht. Jedoch wird bei Verwendung dieser Funktionen mein Script weiter durchlaufen statt angehalten zu werden. Da ich jedoch eine Reihe von Anweisungen in einer Funktion abarbeiten möchte, die in einer genauen Reihenfolge vor und nach dem Laden einer Seite ausgeführt werden sollen, ist mir nicht klar, wie mir „setTimeout“ bzw. „setIntervall“ weiterhelfen könnten, da sie ja lediglich eine Funktion erneut aufrufen und nicht etwa die Ausführung einer Funktion unterbrechen und nach einem festgelegten Zeitpunk an eine bestimmte Stelle innerhalb (!) der Funktion zurück kehren um dann dort die weitere Ausführung des Scriptes wieder aufzunehmen.
Ich komme hier einfach nicht weiter und wäre für eine Lösung sehr, sehr dankbar.
Ich habe mal versucht, zur Simulation, einen Prototypen meines Problems zu erstellen.
Dazu habe ich 3 HTML-Seiten erstell.
1. index.html > enthält 2 Frames; - einer mit einer HMTL-Seite zur
Steuerung des Informationsframes
- einer mit einer HMTL-Seite zur Darstellung der Informationen
2. ctl.htm > enthält Schalter und Funktionen zur Steuerung der Seite
inhalt.html
3. inhalt.html > Stellt Informationen dar
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Index</title>
</head>
<frameset rows="15%, *">
<frame src="ctl.html" name="fraCtl" frameborder="1">
<frame src="inhalt.html" name="fraInhalt" onload="parent.fraCtl.loaded()" onreload="parent.fraCtl.loaded()" frameborder="1">
<noframes>
<body>
</body>
</noframes>
</frameset>
</html>
-------------------------------------------------------------------------------------------------------------
<html> <head>
<title>ctl</title>
</head>
<script type="text/javascript">
var loaded=false;
function loaded() {
loaded=true;
};
function setNeuenText(_Text) {
window.top.frames["fraInhalt"].document.getElementById("inpTxt").value=_Text + " neuer Text";
};
function setText() {
var alterText = window.top.frames["fraInhalt"].document.getElementById("inpTxt").value;
loaded=false;
window.top.frames["fraInhalt"].location.reload(true);
//window.setTimeout("setNeuenText('" + alterText + "');", 3000);
while (loaded==false){};
setNeuenText(alterText);
};
</script>
<body>
<input type="button" value="setText" onclick="setText();">
</body> </html>
-------------------------------------------------------------------------------------------------------------
<html> <head>
<title>Inhalt</title>
<script type="text/javascript">
window.onload=function(){
//simuliert verzögertes Laden der Seite
var iStart=new Date;
while (new Date-iStart<2000) {
};
};
</script>
</head> <body>
<input type="text" id="inpTxt" value="alter Text"/>
</body> </html>
-------------------------------------------------------------------------------------------------------------
Über nachfolgenden Script-Auszug habe ich versucht zu ermitteln, ob die Seite neu geladen wurde :
1. Versuch :
function delay(_WartezeitInMS) {
var iStart=new Date;
while (new Date-iStart<_WartezeitInMS) {};
};
delay(2000);
while (document.readyState != "complete")
delay(2000);
{
2. Versuch :
function loaded() {
loaded=true;
};
<frame src="inhalt.html" name="fraInhalt" onload="parent.fraCtl.loaded()" …
while (loaded==false){};
ich möchte per JavaScript die Bedienung einer bestehenden Webanwendung (HTML-Seiten) automatisieren.
Dazu möchte ich die Werte einiger Steuerelemente (Textfelder, Tabellenzellen, etc.) auslesen, Werte in Steuerelemente (z.B. in Textfelder) eintragen und dann durch automatisches Betätigen eines Schalters neue HTML-Seiten laden und dort in Abhängigkeit den vorherigen Eingaben neue Eingaben automatisiert tätigen. Es soll so etwas ähnliches wie ein Testtool werden.
Die Webanwendung soll unverändert bleiben. Ich habe mir hierzu schon Tools wie „selenium“ angesehen. Diese helfen aber nicht richtig weiter.
Bisher habe ich es geschafft per JavaScript auf eine HTML-Seite und deren Steuerelemente zuzugreifen. Ich kann Werte auslesen, setzten und auch eine neue Seite aufrufen bzw. die Seite neu laden.
Mein Script soll jedoch über mehrere Seiten bzw. über mehrere Aufrufe einer Seite (wenn in Abhängigkeit der Eingaben neue Daten nachgeladen werden müssen) laufen.
Und hier beginnt mein Problem.
Ich kriege es nicht hin, mein Script solange anzuhalten, bis die neue Seite geladen ist bzw. die benötigten Daten nachgeladen sind und dann die Ausführung des Scriptes fortzuführen.
Also in etwa :
lese Wert aus Textfeld 1
ergänze Wert um xyz setzte Wert in Textfeld 1
betätige Schalter „suche Daten gemäß Eingabe aus Textfeld 1“
warte bis Seite neu geladen wurde
[Seite wird neu geladen mit Ergebnis der Suche in Abhängigkeit der Eingabe im Textfeld 1]
lese Werte aus Tabelle aus
vergleiche Werte mit Vorgabe
wiederhole mit anderen Werten
Ich habe versucht nach dem Betätigen des Schalters, der das erneute Laden der Seite auslöst, in Abständen von 2 Sekunden zu prüfen, ob die Seite erneut geladen wurde (delay, while (document.readyState != "complete")), jedoch scheint JS nur im single-thread zu arbeiten, so dass die Seite nicht geladen wird und statt dessen das Script endlos ausgeführt wird.
Auch habe ich schon an „setTimeout“ bzw. „setIntervall“ gedacht. Jedoch wird bei Verwendung dieser Funktionen mein Script weiter durchlaufen statt angehalten zu werden. Da ich jedoch eine Reihe von Anweisungen in einer Funktion abarbeiten möchte, die in einer genauen Reihenfolge vor und nach dem Laden einer Seite ausgeführt werden sollen, ist mir nicht klar, wie mir „setTimeout“ bzw. „setIntervall“ weiterhelfen könnten, da sie ja lediglich eine Funktion erneut aufrufen und nicht etwa die Ausführung einer Funktion unterbrechen und nach einem festgelegten Zeitpunk an eine bestimmte Stelle innerhalb (!) der Funktion zurück kehren um dann dort die weitere Ausführung des Scriptes wieder aufzunehmen.
Ich komme hier einfach nicht weiter und wäre für eine Lösung sehr, sehr dankbar.
Ich habe mal versucht, zur Simulation, einen Prototypen meines Problems zu erstellen.
Dazu habe ich 3 HTML-Seiten erstell.
1. index.html > enthält 2 Frames; - einer mit einer HMTL-Seite zur
Steuerung des Informationsframes
- einer mit einer HMTL-Seite zur Darstellung der Informationen
2. ctl.htm > enthält Schalter und Funktionen zur Steuerung der Seite
inhalt.html
3. inhalt.html > Stellt Informationen dar
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN"
"http://www.w3.org/TR/html4/frameset.dtd">
<html>
<head>
<title>Index</title>
</head>
<frameset rows="15%, *">
<frame src="ctl.html" name="fraCtl" frameborder="1">
<frame src="inhalt.html" name="fraInhalt" onload="parent.fraCtl.loaded()" onreload="parent.fraCtl.loaded()" frameborder="1">
<noframes>
<body>
</body>
</noframes>
</frameset>
</html>
-------------------------------------------------------------------------------------------------------------
<html> <head>
<title>ctl</title>
</head>
<script type="text/javascript">
var loaded=false;
function loaded() {
loaded=true;
};
function setNeuenText(_Text) {
window.top.frames["fraInhalt"].document.getElementById("inpTxt").value=_Text + " neuer Text";
};
function setText() {
var alterText = window.top.frames["fraInhalt"].document.getElementById("inpTxt").value;
loaded=false;
window.top.frames["fraInhalt"].location.reload(true);
//window.setTimeout("setNeuenText('" + alterText + "');", 3000);
while (loaded==false){};
setNeuenText(alterText);
};
</script>
<body>
<input type="button" value="setText" onclick="setText();">
</body> </html>
-------------------------------------------------------------------------------------------------------------
<html> <head>
<title>Inhalt</title>
<script type="text/javascript">
window.onload=function(){
//simuliert verzögertes Laden der Seite
var iStart=new Date;
while (new Date-iStart<2000) {
};
};
</script>
</head> <body>
<input type="text" id="inpTxt" value="alter Text"/>
</body> </html>
-------------------------------------------------------------------------------------------------------------
Über nachfolgenden Script-Auszug habe ich versucht zu ermitteln, ob die Seite neu geladen wurde :
1. Versuch :
function delay(_WartezeitInMS) {
var iStart=new Date;
while (new Date-iStart<_WartezeitInMS) {};
};
delay(2000);
while (document.readyState != "complete")
delay(2000);
{
2. Versuch :
function loaded() {
loaded=true;
};
<frame src="inhalt.html" name="fraInhalt" onload="parent.fraCtl.loaded()" …
while (loaded==false){};
Comment