August 2011

jscookMenu mit Selenium testen


24 Aug

Vor einigen Tagen hatte ich das Problem, dass ich eine Webanwendung mit einem jscookMenu als zentrale Navigation mit Selenium testen wollte. Das Menü stammte hierbei aus den MyFaces Tomahawk, wurde also via JavaServerFaces (JSF) generiert. Das Problem hierbei war, dass nirgendwo eindeutige IDs im HTML-Quelltext vorhanden waren, um ein Menüitem eindeutig zu identifizieren. Das Einfügen von IDs war auch nicht möglich, da JSF diese einfach nicht mit rendert. Auch die anderen Selenium Standard Locators führten nicht zum Ziel. Einzig über den XPath, augehend vom div-Tag des Menüs, konnte ich mit Selenium einen Klick auf ein Menüitem durchführen. Leider brachte mich das nicht wirklich weiter, da das Menü dynamisch ist und immer mal wieder Menüitems dazukommen oder verschwinden, abhängig von den Einstellungen in der Webanwendung.

Die Lösung: Ich habe einen eigenen Selenium Locator geschrieben, der es mir nun erlaubt jedes Menüitem anzuklicken, einfach anhand der Aufschrift (Label). Den Locator habe ich einfach als Selenium User Extension in JavaScript implementiert.

/*
 * Adds an own locator for the jscookMenu menu items to selenium
 * due to missing IDs in the menu.
 * Returns the first found menu item.
 * The running order is:
 * - all parent Items
 * - all parent subfolders
 * - all subfolder items
 * - all subfolder subfolders
 *
 * Usage from JavaSource e.g.:
 * 		selenium.mouseUp("menuitem=Impressum");
 * 		Do not use selenium.click(), not working in FF
 * 		or selenium.clickAt(), very slow in IE!
 *
 * Author: Thomas Klumpp
 */
PageBot.prototype.locateElementByMenuItem = function(text, inDocument) {

	/*
	 * Returns all elements with the given class name.
	 * Firefox has a native method (same name) for that since version 3.
	 * Internet Explorer has this native method since version 9.
	 * So we better use or own implementation to ensure, that its running everywhere.
	 * In addition, the return type of these native methods is a NodeList (live collection).
	 * We are using an array for easy concatenation here.
	 */
	getElementsByClassName = function(className)
	{
		var hasClassName = new RegExp('(?:^|\\s)' + className + '(?:$|\\s)');
		var allElements = inDocument.getElementsByTagName('*');
		var results = [];

		var element;
		for (var i = 0; (element = allElements[i]) != null; i++) {
			var elementClass = element.className;
			if (elementClass && elementClass.indexOf(className) != -1 && hasClassName.test(elementClass))
				results.push(element);
		}

		return results;
	}

	//getting all different menu item types
	var mainItems = getElementsByClassName('ThemeOfficeMainItemText');
	var mainFolderItems = getElementsByClassName('ThemeOfficeMainFolderText');
	var menuItems = getElementsByClassName('ThemeOfficeMenuItemText');
	var menuFolderItems = getElementsByClassName('ThemeOfficeMenuFolderText');

	//concatenation
	var allItems = mainItems.concat(mainFolderItems).concat(menuItems).concat(menuFolderItems);

	for (var i = 0; i < allItems.length; i++) {
        var currentElement = allItems[i].firstChild;
        if (currentElement.data == text) {
        	//return first found item parent
            return currentElement.parentNode;
        }
    }

	//nothing found
    return null;
};

Zur Verwendung in der Selenium IDE, kann man das JavaScript File einfach über die Optionen einbinden. Zur Verwendung aus Java mit Selenium RC, einfach den Server mit dem Parameter -userExtension starten:

java -jar selenium-server.jar -userExtensions user-extensions.js

Verwendet werden kann der Locator z.B. dann so:

selenium.mouseUp("menuitem=Impressum");

menuitem= ergibt sich aus dem JavaScript Methodenname.

Gefällt dir das? Teile es mit deinen Freunden:

VPN mit FRITZ!Box via Shrew Soft VPN Client


13 Aug

Seit vergangener Woche bin ich begeisterter Besitzer der FRITZ!Box 7390 dem aktuellen Flagship von AVM. Die Möglichkeiten die dieses Gerät bietet sind denke ich mit keinem anderen Gerät auf dem Markt vergleichbar. Eine Möglichkeit ist, sind VPN Verbindungen. Man kann sich direkt über die Box nicht nur in ein bestehendes Netz einwählen, sondern die FRITZ!Box auch selbst als VPN-Einwahlpunkt konfigurieren. Somit kann ich nun von überall auf der Welt einen sicheren VPN-Tunnel zu meiner FRITZ!Box zuhause aufbauen und alles darüber tunneln. Dies eignet sich besonders wenn man mal nur ein unsicheres fremdes WLAN (z.B. im Urlaub) zur Verfügung hat.
Eine super Sache ist es auch wenn ich mich mit dem iPhone einwähle, dann kann ich nämlich dank der FRITZ!Box Fon App von überall aus den Telefonanschluss Zuhause nutzen.

Beispiel eines Tunnels in Rechnernetzen. Hier: SSH-Tunnel

AVM bietet von Haus aus einen VPN-Client für den Computer an, den ich aber nicht sehr gelungen finde, da man ihn nur über Konfigurationsdateien konfigurieren kann. Auf meinem Windows 7 64-bit Testsystem stürzte zudem die Installation beim ersten Versuch ab und auch eine Verbindung brachte ich beim ersten Versuch nicht zu stande. Auf dem VPN-Portal von AVM gab es aber glücklicherweise eine Anleitung für den Shrew Soft VPN Client den ich schon früher zur Einwahl ins HS-Mannheim VPN genutzt hatte, bis die Affen die dort unser Rechenzentrum administrieren meinten den Zugriff über diesen Client sperren zu müssen, da er “das VPN kaputt machen würde”.

Leider funktioniert die Einwahl nicht wenn man genau die Schritte der Anleitung befolgt. In der FRITZ!Box erscheint nur “wird aufgebaut”, aber eine VPN-Verbindung kommt nicht zustande. Meine Suche im Internet ergab, dass viele das selbe Problem haben, aber nirgendwo war eine Lösung zu finden. Nun, nach etwas Gehrin anstrengen und etwas herumprobieren fand ich die Lösung.

Zusätzlich habe ich noch eine XAUTH eingebaut um zusätzlich noch etwas Sicherheit zu bekommen. Desweiteren wir damit dieser Konfiguration nun alles getunnelt und nicht nur der Zugriff auf das lokal Netz hinter der FRITZ!Box.

Meine Konfiguration in der FRITZ!Box sieht nun so aus:

vpncfg {
        connections {
                enabled = yes;
                conn_type = conntype_user;
                name = "CONNECTIONNAME";
                always_renew = no;
                reject_not_encrypted = no;
                dont_filter_netbios = yes;
                localip = 0.0.0.0;
                local_virtualip = 0.0.0.0;
                remoteip = 0.0.0.0;
                remote_virtualip = 192.168.1.201;
                remoteid {
                        user_fqdn = "CONNECTIONNAME";
                }
                mode = phase1_mode_aggressive;
                phase1ss = "all/all/all";
                keytype = connkeytype_pre_shared;
                key = "PRESHAREDKEY";
                cert_do_server_auth = no;
                use_nat_t = yes;
                use_xauth = yes;
                use_cfgmode = no;
				xauth {
					valid = yes;
					username = "USERNAME";
					passwd = "PASSWORD";
				}
                phase2localid {
                        ipnet {
                                ipaddr = 192.168.1.0;
                                mask = 255.255.255.0;
                        }
                }
                phase2remoteid {
                        ipaddr = 192.168.1.201;
                }
                phase2ss = "esp-all-all/ah-none/comp-all/pfs";
                accesslist =
                             "permit ip 0.0.0.0 0.0.0.0 192.168.1.201 255.255.255.255";
        }
        ike_forward_rules = "udp 0.0.0.0:500 0.0.0.0:500",
                            "udp 0.0.0.0:4500 0.0.0.0:4500";
}

Die Konfigurationsdatei für den Shrew Soft Client sieht nun so aus (einfach in eine Textdatei kopieren, speichern und importieren):

n:version:2
n:network-ike-port:500
n:network-mtu-size:1380
n:client-addr-auto:1
n:network-natt-port:4500
n:network-natt-rate:15
n:network-frag-size:540
n:network-dpd-enable:1
n:client-banner-enable:1
n:network-notify-enable:1
n:client-wins-used:1
n:client-wins-auto:1
n:client-dns-used:1
n:client-dns-auto:1
n:client-splitdns-used:0
n:client-splitdns-auto:0
n:phase1-dhgroup:2
n:phase1-keylen:256
n:phase1-life-secs:3600
n:phase1-life-kbytes:0
n:vendor-chkpt-enable:0
n:phase2-keylen:0
n:phase2-life-secs:3600
n:phase2-life-kbytes:0
n:policy-nailed:1
n:policy-list-auto:0
s:network-host:HOSTNAME
s:client-auto-mode:pull
s:client-iface:virtual
s:network-natt-mode:enable
s:network-frag-mode:enable
s:auth-method:mutual-psk-xauth
s:ident-client-type:ufqdn
s:ident-server-type:address
s:ident-client-data:CONNECTIONNAME
b:auth-mutual-psk:CRYPTEDPRESHAREDKEY
s:phase1-exchange:aggressive
s:phase1-cipher:aes
s:phase1-hash:sha1
s:phase2-transform:esp-aes
s:phase2-hmac:sha1
s:ipcomp-transform:deflate
n:phase2-pfsgroup:2
s:policy-level:require
s:policy-list-include:192.168.1.0 / 255.255.255.0,0.0.0.0 / 0.0.0.0

Beim Shrew Soft Client ist die wichtigste Änderung im letzten Register “Policy”:

Policy Tab

Wer nicht möchte, dass alles getunnelt wird, der soll hier den letzten Eintrag weglassen und DNS und WINS im Register “Name Resolution” deaktivieren.

Zuletzt noch ein praktischer Tipp bei der Verwendung des Shrew Soft Clients:
Einfach auf dem Desktop eine Verknüpfung zur ipsecc.exe mit dem Parameter -r “CONNECTIONNAME” -u “USERNAME” anlegen zum schnellen Zugriff ohne jedesmal den Access Manager starten zu müssen.

Gefällt dir das? Teile es mit deinen Freunden:

Zurück zum alten Facebook-Chat


07 Aug

Seit Facebook, den neuen Chat eingeführt hat, wünschen sich viele den alten Chat wieder zurück. Im neuen Chat sieht man angeblich nur noch eine von Facebook festgelegte Auswahl an Freunden die gerade online sind, und auch die dauerhafte Leiste rechts ist für manche störend. Ich selbst kann diese ganze Aufregung nicht so ganz nachvollziehen, denn ich fand den alten Chat auch schon besch*****. Allein der Name “Chat” ist an der Stelle schon falsch, denn eigentlich handelt es sich um Instant Messaging und nicht um chatten im herkömmlichen Sinne mit IRC. Glücklicherweise implementiert der Facebook-Chat das Extensible Messaging and Presence Protocol, kurz XMPP. Das bedeutet, man kann mit einem Client wie z.B. Miranda auf den Chat zugreifen.

Nichts desto trotz, gibt es eine Möglichkeit den alten Facebook-Chat zurück zu bekommen. Das Zauberwort heißt Userscripts. Das bedeutet auf Clientseite wird die Facebook Seite per JavaScript nachdem sie empfangen wurde lokal auf dem eigenen Computer manipuliert. Für den Browser Mozilla Firefox gibt es hierfür ein gutes Add-on genannt Greasemonkey, welches das Userscript darüberlegt. Für andere Browser gibt es ebenso Plugins.

Im folgenden eine kurze Anleitung welche Schritte zu tun sind um den alten Chat wieder zu bekommen:

  • Greasemonkey-Add-on im Firefox installieren
    Einfach den Add-ons Manager im Firefox aufrufen, nach Greasemonkey suchen, auf den “Installieren” Button drücken und den Anweisungen folgen.

Add-ons Manager öffnen

 

 

 

 

 

 

 

 

 

 

Greasemonkey suchen und installieren

 

 

 

 

  • Das Userscript einbinden, indem auf dieser Seite oben rechts der grüne “Install” Button gedrückt wird.

Userscript einbinden

 

 

 

 

 

 

 

 

 

 

 

 

 

  • Auf Facebook gehen und kontrollieren ob es funktioniert hat

 

Das Script hat einige kleinere Probleme, wird aber zur Zeit ständig weiterentwickelt und verbessert.

Gefällt dir das? Teile es mit deinen Freunden:

thomas-klumpp.de

information about me and my life