Wie bestätige ich ein Javascript-Popup mit Capybara?

73

Ich habe einige online gefundene Beispiele ausprobiert, aber ohne Glück. Ich möchte die Bestätigungsmeldung eines Löschlinks bestätigen. Der letzte Versuch war der folgende Code, der jedoch zu einem Capybara :: NotSupportedByDriverError-Fehler führte.

def confirm_dialog
  page.evaluate_script('window.confirm = function() { return true; }')
end
Eric M.
quelle
Mögliches Duplikat von Wie teste ich einen Bestätigungsdialog mit Cucumber? . Der Autor der akzeptierten Antwort stimmt dem Duplikat zu.
Ciro Santilli 法轮功 冠状 病 六四 事件 8
Siehe meine Antwort hier für den neueren Weg, dies zu tun: stackoverflow.com/a/26472467/2170577
Jillian Foley

Antworten:

59

Hinzufügen einer Antwort für diejenigen, die dies im Jahr 2016 und darüber hinaus treffen. Sie können Capybara jetzt direkt verwenden, um ein Bestätigungsfeld zu akzeptieren. Sie tun dies, indem Sie den Code umbrechen, der dazu führt, dass das Bestätigungsfeld in der Funktion accept_confirm angezeigt wird.

accept_confirm do
  click_link 'Destroy'
end
retroGiant
quelle
54

Wechseln Sie zunächst zur Verwendung von Selenium als Treiber, indem Sie ein @ javascript-Tag vor Ihr Szenario setzen.

Der folgende Code in Ihrem Gurkenschritt bestätigt dann den Dialog:

page.driver.browser.switch_to.alert.accept
# or
page.driver.browser.switch_to.alert.dismiss
# or
page.driver.browser.switch_to.alert.text

Wie @NobbZ sagte, wurde diese Frage zuvor hier gestellt und beantwortet: Wie teste ich einen Bestätigungsdialog mit Cucumber? .

Weitere Selendokumentation finden Sie auch hier: http://code.google.com/p/selenium/wiki/RubyBindings#JavaScript_dialogs

Peter Nixey
quelle
4
undefinierte Methode `switch_to 'für # <Capybara :: RackTest :: Browser: 0x007ffca8a79890>
Dima
1
Ich habe diesen undefinierten Methodenfehler erhalten und dann festgestellt, dass ich den Aufruf von switch_to überhaupt nicht benötigte, da Selen (glaube ich) bei allen Bestätigungen automatisch true zurückgibt. Das wird nicht allen helfen, könnte aber einigen helfen.
Elc
1
@DimaGoltsman Sie verwenden RackTest. Die Antwort bezieht sich auf den Selentreiber. Sie müssen den Treiber festlegen, bevor der Test ausgeführt wird, Capybara.current_driver = :seleniumoder js: true zu dem Beispiel hinzufügen, in dem der Treiber :seleniumstandardmäßig festgelegt werden soll, da dies der Standard istCapybara.javascript_driver
iNulty
Funktioniert mit Capybara unter Verwendung eines Selentreibers in Rails. Danke
luigi7up
Ich habe versucht zu verwenden page.driver.browser.switch_to, bekam aber eine DEPRECATION-Warnung, wurde aber dazu gebracht: stackoverflow.com/questions/26275359/…
Echo
15

für Capybara-Webkit:

page.driver.browser.accept_js_confirms
page.driver.browser.reject_js_confirms

was noch funktioniert, aber die Dokumentation sagt auch:

page.driver.accept_js_confirms!
page.driver.accept_js_confirms!

Siehe https://github.com/thoughtbot/capybara-webkit , suchen Sie nach "accept_js_confirms".

Zaubergott
quelle
2
Es hat bei mir mit page.driver.accept_js_confirms funktioniert! (in der Tat von github.com/thoughtbot/capybara-webkit )
Adrien
1
Derzeit funktioniert diese Zeile für Capybara: page.driver.browser.switch_to.alert.accept
swilgosz
Sieht so aus, als ob Ihre Seite page.driver.reject_js_confirms sein sollte!
RetroGiant
10

Ich hatte Zeitprobleme mit Browser-Dialogen in einer CI-Umgebung, daher frage ich nach einem Dialog, bevor ich ihn akzeptiere:

def accept_browser_dialog
  wait = Selenium::WebDriver::Wait.new(:timeout => 30)
  wait.until {
    begin
      page.driver.browser.switch_to.alert
      true
    rescue Selenium::WebDriver::Error::NoAlertPresentError
      false
    end
  }
  page.driver.browser.switch_to.alert.accept
end
Stephan Seidt
quelle
6

Ich musste im Webkit-Test einen Schlaf verwenden, da er jedes Mal und dann anderweitig fehlschlagen würde.

Folgendes habe ich mir ausgedacht, nachdem ich alle Beiträge gelesen hatte:

if page.driver.class == Capybara::Selenium::Driver
  page.driver.browser.switch_to.alert.accept
elsif page.driver.class == Capybara::Webkit::Driver
  sleep 1 # prevent test from failing by waiting for popup
  page.driver.browser.accept_js_confirms
else
  raise "Unsupported driver"
end
Michael Yagudaev
quelle
Ja, seien Sie nur sehr vorsichtig, um nicht zu viele davon hinzuzufügen.
Dadurch werden
3

In Capybara ist es sehr einfach, das Modellfenster zu akzeptieren. Sogar wir können dasselbe in Selen tun, aber es ist wenig schwierig für Menschen, die sich Selens nicht bewusst sind.

page.accept_modal #Dies akzeptiert das modale Fenster

page.dismiss_modal #Dies wird das modale Fenster ablehnen / schließen

Jagan
quelle
Dies bringt mich zurückNoMethodError: private method 'accept_modal' called for #<Capybara::Session>
Ruff9
2

Ich würde vermuten, dass Sie Ihrer Gem-Datei Selen hinzufügen und es konfigurieren müssen und Capybara, dass Capybara Selen als Treiber verwendet.

Ich denke auch, wie man einen Bestätigungsdialog mit Gurke testet? ist Ihrer Frage sehr ähnlich, insbesondere der akzeptierten Antwort.

NobbZ
quelle
2

Versuchen Sie, :js => truezu Ihrem Test hinzuzufügen .

Mit der Metadatenfunktion von RSpec können Sie zu einem anderen Treiber wechseln. Verwenden Sie: js => true, um zum Javascript-Treiber zu wechseln, oder geben Sie die Option: driver an, um zu einem bestimmten Treiber zu wechseln. Zum Beispiel:

it 'will use the default js driver' :js => true do
  ...
end
Vasiliy Ermolovich
quelle