22

Ich habe eine wirklich einfache Linie in einem Test, der Skript wie folgt Anrufe ausführen:Wie wird ein Wert zurückgegeben, wenn execute_script in Capybara verwendet wird?

puts page.execute_script("return somefunction();").to_i.inspect 

Und in Javascript habe ich eine Funktion wie folgt aus:

function somefunction(){ 
    console.log("test"); 
    return 999; 
} 

Der ‚Test‘ aus dem Konsolenprotokoll wird abgemeldet, läuft also aber ...

Mit Blick auf die Protokolle, wenn der Test ausgeführt wird, gibt die execute_script 0 nicht 999, also in Rspec kann ich nicht auf den Rückgabewert von der Funktion erhalten, wie Ich mache page.execute_script zurück dieser Wert von dieser Funktion?

+0

Welche Treiber verwenden Sie? Es scheint mit mindestens Selenium-Webdriver zu funktionieren. –

+0

Es ist Poltergeist. – Smickie

Antwort

33

Der Poltergeist-Treiber ist für Null zurück für execute_script:

def execute_script(script) 
    browser.execute(script) 
    nil 
end 

Poltergeist nur einen Wert zurückgeben, wenn Sie den evaluate_script verwenden:

def evaluate_script(script) 
    browser.evaluate(script) 
end 

Capybara entsprechende Methoden für jede hat - dh Session#execute_script und Session#evaluate_script. Der Code sollte funktionieren, wenn Sie mit evaluate_script wechseln (und wie @AndreyBotalov weist darauf hin, Sie auch entfernen müssen die return):

puts page.evaluate_script("somefunction();").to_i.inspect 
+1

Beachten Sie, dass diese Antwort nicht mit Selenium funktioniert, da Capybara 'return' selbst einfügen würde. –

+0

@AndreyBotalov, korrigierte ich den Code, um den 'return' zu entfernen, wenn 'evaluate_script' verwendet wurde. Einschließlich der Rückkehr wird eine Ausnahme für Selenium und Poltergeist ausgelöst. –

Verwandte Themen