2017-06-18 2 views
2

Ruby lernen, frühe Stadien. Ich habe ein sehr einfaches Skript, das ich auf Terminal laufen lasse und ich möchte, dass es Dateien im Browser basierend auf Benutzereingaben öffnet. Welcher Code kann ich (ich habe Verweise auf RoR bisher gefunden, nicht helfen):Bild in Browser mit Ruby öffnen

puts "What type of train would u like to see today? steam or diesel" 
print "> " 
train = $stdin.gets.chomp 
if train == "steam" 

welcher Code kann ich so Skript xyz Bild öffnet sich auf Browser setzen?

elsif train == "diesel" 

welcher Code kann ich setzen so xyz Bild auf Browser-Skript öffnet?

else "Sorry, I didn't understand that. Bye" 

end 

Antwort

1

Sie wollen wahrscheinlich so etwas wie Selen WebDriver verwenden, um zu starten und das Browserfenster zu steuern. Du musst den Selen-Webdriver-Juwel installieren, und in diesem Beispiel verwende ich Chrome (wozu auch der Chrometreiber benötigt wird), also musst du das ebenfalls installiert haben (du kannst stattdessen :firefox verwenden, wenn du möchtest) .

Try this:

require 'selenium-webdriver' 

driver = Selenium::WebDriver.for :chrome 
puts "What type of train would u like to see today? steam or diesel" 

train = gets.chomp 

if train == "steam" 
    driver.get 'https://en.wikipedia.org/wiki/Steam_locomotive' 
elsif train == "diesel" 
    driver.get 'https://en.wikipedia.org/wiki/Diesel_locomotive' 
else "Sorry, I didn't understand that. Bye" 
end 
0

öffnen

Der einfachste Weg, einen Web-Browser über die Befehlszeile zu öffnen, ist die open command zu verwenden. Wenn eine Zeichenfolge angegeben wird, die wie eine URL aussieht (beginnt mit http, hat eine TLD usw.), ist der Befehl open intelligent genug, um den aktuellen Standardwebbrowser zu starten.

Backticks und% x

Zum Glück Rubys Kernel-Modul (die alle Objekte erben) ein method schnell ein Sub-Shell zu starten, einige Arbeiten durchführen und dann die Ausführung zu Ihrem Ruby-Skript zurückzukehren.

Wir können entweder erreichen dies mit Backticks:

`open https://google.com`

oder mit% x Syntax, die uns unsere eigenen Begrenzungen definieren können (persönlich, ziehe ich diesen Stil):

%x(open https://google.com)

Der obige Code sollte eine neue Browserregisterkarte in Ihrem Standardbrowser öffnen und auf Google verweisen. Als Nebenbemerkung habe ich bemerkt, dass es, wenn Sie mehrere Browserfenster geöffnet haben, willkürlich erscheint, in welchem ​​Fenster der neue Tab geöffnet ist. Wenn Sie den Browser nicht sehen, überprüfen Sie Ihre minimierten Fenster.

Es ist erwähnenswert, dass, wenn Shell-Befehle in der Subshell auf stdout schreiben, die Ausgabe stattdessen als String an Ihr Skript zurückgegeben wird. Das ist großartig, weil wir Sachen wie diese tun können:

files_in_home_directory = %x(cd && ls -a)

Sie können auch String-Interpolation verwenden!

song = "https://open.spotify.com/track/5ghIJDpPoe3CfHMGu71E6T" 
%x(open #{song}) 

Prozess.spawn

Die obige Methode blockiert, was bedeutet, dass Ihr Ruby-Skript zum Stillstand kommt und darauf wartet, dass die Subshell ihre Arbeit beendet, bevor sie die Kontrolle an Ihr Skript zurückgibt. Das ist völlig in Ordnung für kleine Dinge wie das Öffnen eines Links in einem Browser, aber wenn du jemals etwas langsamer in dieser Subshell machen musst, wirst du eine schlimme Zeit haben. Process.spawn lässt uns eine Subshell in einem anderen Prozess öffnen und dann vergessen. Entweder ist die Arbeit erledigt wird oder es funktioniert nicht, aber unser Ruby-Skript kann über sein Geschäft gehen:

%x(sleep 10 && open https://google.com) pausiert nicht nur die Sub-Shell, sondern auch das Skript

Process.spawn("sleep 10 && open https://google.com") ermöglicht Ihrem Skript während der Subshell fortzusetzen macht seinen Job in einem anderen Prozess.

Im Gegensatz zur Methode backticks /% x gibt Process.spawn nicht stdout als Zeichenfolge zurück, sondern gibt eine Prozess-ID zurück. Es gibt many ways, um das Ergebnis dieses Prozesses mithilfe der PID zu überprüfen.

Warnung: Sie sollten niemals eine Zeichenkette ausführen, die vom Benutzer eingegebene Werte enthält. Dies ist nur ein Problem.