it-swarm.com.de

Kann ich mit Capybara mit versteckten Elementen interagieren?

Ich habe ein Dateifeld, das opacity: 0 enthält und eine falsche Schaltfläche überlappt. Es ist eine gängige CSS-Technik, eine Art "Upload-Schaltfläche" zu fälschen, die in verschiedenen Browsern konsistent angezeigt wird.

Capybara erlaubt mir nicht, attach_file für diese Eingabe aufzurufen. Der Fehler ist Selenium::WebDriver::Error::ElementNotVisibleError: Element is not currently visible and so may not be interacted with.

Weiß jemand, wie man Capybara zwingt, mit unsichtbaren Elementen zu interagieren?

Die Antwort ist immer noch unbeantwortet, aber ich habe eine Lösung gefunden. Nichts Intelligentes, machen Sie das Element einfach mit einem einfachen Skript sichtbar

  page.execute_script %Q{
    $('#photos').css({opacity: 1, transform: 'none'});
  }

Ich poste es für die Platte.

40
miguel.camba

Sie können mit ausgeblendeten Elementen mit der visible: false-Eigenschaft in Capybara interagieren.

Wenn Sie auf ein ausgeblendetes Element klicken möchten, verwenden Sie:

find("#photos", visible: false).click

Verwenden Sie click_button('#photo') nicht direkt 

71
Vijay Chouhan

Der Autor von Capybara empfiehlt, Capybara.ignore_hidden_elements unmittelbar vor dem Anzeigen des unsichtbaren Elements zu setzen und es danach zurückzusetzen:

Capybara.ignore_hidden_elements = false
click_button 'my invisible button'
Capybara.ignore_hidden_elements = true
19
user664833

Im Allgemeinen sollte die Interaktion mit nicht sichtbaren Elementen bei Verwendung von Capybara nicht möglich sein (Sie können sie mit der visible: false/hidden-Option in den meisten Suchern finden, tun aber nichts dagegen). Die Dateieingabe ist jedoch ein Sonderfall, da das Element häufig ausgeblendet wird. Aufgrund von Sicherheitsbeschränkungen gibt es keine andere Möglichkeit, eine Datei durch Interaktion mit den sichtbaren Elementen der Seite tatsächlich hinzuzufügen. Aus diesem Grund verfügt attach_file über eine make_visible-Option, mit der Capybara das Element sichtbar machen, die Datei anhängen und dann das CSS auf die ursprüngliche Einstellung zurücksetzen kann.

attach_file('photos', file_path, make_visible: true)
4
Thomas Walpole

Am Ende habe ich einen anderen Weg gefunden.

execute_script() hat mir Schwierigkeiten bereitet (es würde die Testausführung auf FireFox einfrieren), also habe ich folgendes getan:

Ich hatte bereits eine entsprechende Javascript-Datei. Ich habe folgendes angehängt

<% if ENV["Rails_ENV"] == "test" %>
  $('#photos').show()
<% end %>

Ich musste auch .erb an meine Javascript-Datei anhängen, um eine korrekte Handhabung der Rails-Assets zu ermöglichen.

In meiner Testdatei habe ich bereits ENV["Rails_ENV"] = "test" eingestellt.

Auf diese Weise konnte ich die Benutzeroberfläche einfach zum Testen dumm machen und trotzdem das Erscheinungsbild der Produktion beibehalten.

0
Jay

Miquel, danke für workaraund. 

Ich habe ein ähnliches Problem bei der Interaktion mit versteckten Dateieingaben für die C # -Bindung für Selenium Webdriver 2.35 und Firefox 24. Die Dateiauswahl funktionierte mit einem ähnlichen Trick:

((IJavaScriptExecutor)webdriver).ExecuteScript("$('#fileUploadInput').css({opacity: 1, transform: 'none'});");

IWebElement e = webdriver.FindElement(By.CssSelector("input#fileUploadInput")));

e.SendKeys("c:\\temp\\inputfile.txt");
0

Wenn das verborgene Element in einem sichtbaren übergeordneten Element verschachtelt ist (z. B. eine verborgene Eingabe in einer sichtbaren Beschriftung), können Sie stattdessen auf das übergeordnete Element klicken. Wenn Sie die Eingabe immer noch nach ID suchen möchten, können Sie wie folgt zum übergeordneten Element navigieren:

find('#hidden_input').find(:xpath, '..').click
0
Kevin Qi

Ich habe es so mit Elementen gemacht, die den CSS-Stil display:none; festgelegt haben:

page.execute_script("$('.all-hidden-elements').show();");
all('.all-hidden-elements').first.click
0
karlingen