2016-07-24 12 views
2

Ich habe eine HTML-Datei:WebDriver Javascript: Wie erhält man ein umfassendes DOM, wenn das Skript in Firefox ausgeschaltet ist?

<div id="test">Hello World</div> 
<script>document.getElementById("test").innerHTML = "Test";</script> 

Mit Selenium WebDriver mit Javascript Binding, ich mag einen umfassenden DOM der HTML-Datei, wie zum Beispiel Liste der Attribute eines Elements erhalten, Namespace jeden Attributs, Namespace das Element und so weiter.

Ich verwende die ExecuteScript Methode, das zu extrahieren, weil einfach nicht Selen nicht, dass die API noch haben, zum Beispiel:

driver.executeScript("return document.lastChild.attributes.length;"); 

Das Problem ist, möchte ich DOM der HTML-Datei extrahieren, während das Skript zu sein, ist ausgeschaltet. Ich habe JavaScript in Chrome deaktiviert und kann weiterhin das Skript von Selenium ausführen, um das DOM zu erhalten. Aber wenn es um Firefox geht, konnte ich es leider nicht schaffen. Das Skript wird blockiert, und ich bekam Fehlermeldung:

JavascriptError: waiting for evaluate.js load failed 

Ich habe versucht, zu aktivieren und die Javascript zu deaktivieren, indem Sie auf der über die Einstellung: config oder sogar Skript-Blocker add ons wie NoScript und yesscript haben, aber kein Glück. Es scheint, als wenn das Javascript auf dieser Seite einfach ausgeschaltet ist, kann Selenium kein Skript ausführen.

Antwort

0

Endlich fand ich eine Lösung. Es ist sowieso ineffektiv, aber dies ist eine Alternative, um das Skript von Selenium auszuführen, ohne die executeScript-Methode zu verwenden. Rufen Sie die Browserkonsole auf, schreiben Sie das Skript, setzen Sie das Ergebnis in eine Warnmeldung, und rufen Sie den Text aus der Warnung ab. Hier ist das Beispiel:

var script = 'alert("value you want to get");'; 
var act = new webdriver.ActionSequence(driver); 
driver.findElement(webdriver.By.tagName('html')).sendKeys(Key.CONTROL + Key.SHIFT + 'k'); // Calling browser JS console 
driver.switchTo().activeElement().sendKeys(Key.RETURN); // Switch focus to the console 
act.sendKeys(script).sendKeys(Key.RETURN).perform(); // Write the script on the console 
driver.switchTo().alert().getText().then(function (value) { 
    console.log(value); 
}); // Switch to and get the text from the alert 
driver.switchTo().alert().accept(); // Close the alert box