2017-10-24 2 views
0

Das ist also ein bisschen eine Performance-Frage in Bezug auf Selenium Webdriver (Chromedriver) und Capybara.Capybara/Selenium: Beschleunigen des Dropdown-Menüs Auswählen?

Ich habe einige React-Select-Dropdowns mit ziemlich viel Daten in ihnen. Aus irgendeinem Grund nehmen die react-selects sehr lange Zeit, um die Option in ihnen auszuwählen. Der Code ist ziemlich einfach und ich packte es von hier: https://github.com/JedWatson/react-select/issues/832

Aber es kommt grundsätzlich nach unten zu:

page.find('.Select-control').click 
page.find('.Select-option', text: 'the text').click 

Das Ding ist, das funktioniert gut. Aber es dauert extrem lange (Upwards von einer Minute ein Dropdown). Jetzt ... in der Verteidigung von Capybaras haben diese Drop-downs eine Menge Optionen zur Auswahl, also dachte ich, dass die Auswahl aus dem obersten Element am schnellsten wäre, aber das scheint es nicht zu beeinflussen.

Hat Capybara/Selenium die "Optionen" in einer anderen sortierten Liste irgendwo oder so? Da würde ich davon ausgehen, dass die Auswahl aus einer Top-Option im Dropdown schneller wäre, aber es scheint nicht zu sein?

Antwort

2

Wenn Sie die Option text verwenden, findet find zuerst alle Elemente, die mit dem Locator übereinstimmen, mit dem aktuellen Auswahltyp. In Ihrem Fall ist der Selektortyp standardmäßig: css, und der Locator ist '.Wählen Sie die Option . So Capybara will find all elements with the class Select-Option` und dann wird jedes dieser Elemente durchgehen, um den Text zu vergleichen, um zu sehen, was übereinstimmt (und die Sichtbarkeit prüft) es muss alle vergleichen, um sicherzustellen, dass der Selektor nicht mehrdeutig ist.

Eine Möglichkeit, das zu beschleunigen wäre first zu verwenden, um mit einer minimum Option

page.first('.Select-option', text: 'the text', minimum: 1).click 

die Überprüfung einige der Text und die Sichtbarkeit überspringen kann, da es sich nicht um mehrdeutige Elemente kümmern muss. Eine andere Lösung wäre, die text Option ganz überspringen und in eine XPath entlang der Linien von

page.find(:xpath, XPath.css('.Select-option')[XPath.string.n.is('the text')]).click # Haven't verified this is 100% correct but it should be close 

schreiben Wenn Sie diese viel in der App tun Sie können einen eigenen Selektor für dieses

prüfen Schaffung
Capybara.add_selector(:react_option) do 
    xpath do |locator| 
    XPath.css('.Select-option')[XPath.string.n.is(locator)] 
    end 
    # You can add other filters in here - see https://github.com/teamcapybara/capybara/blob/master/lib/capybara/selector.rb 
end 

die Sie dann erlauben würde,

page.find(:react_option, 'the text').click 

Hinweis zu tun, wenn Sie die Elementtypen begrenzen kann, wird es auch die Abfrage effizienter gestalten, so dass, wenn alle th e Elemente sind <li> Elemente Sie so etwas wie

XPath.css('li.Select-option')[XPath.string.n.is(locator)] 
+0

Dank tun wollen könnte, alles wird beschleunigen helfen, so werde ich diese versuchen. Verwenden Sie Xpath nicht spröde? vor allem, wenn sich die Option Bestellung ändert? Oder wäre das hier nicht betroffen? – msmith1114

+0

@ msmith1114 Es ist nicht so, dass XPath spröde ist, es ist, dass die Art und Weise, wie die meisten neuen Benutzer von Capybara versuchen, es zu benutzen, zu brüchigen Dingen führt. Sie neigen dazu, den wirklich langen XPath, der vom Browser erzeugt wird, zu kopieren und in Capybara ablegen, was bedeutet, dass wenn ein kleines bisschen Seitenstruktur geändert wird, es für das erwartete Element ungültig ist. Die erzeugten XPaths suchen nur nach bestimmten Klassen für Elemente und nach dem Text im Element. Im Allgemeinen ist XPath schwieriger zu lesen als CSS, daher sollte die Faustregel möglichst bei CSS bleiben, CSS hat jedoch keine Textinhalt-Übereinstimmungsfähigkeit, während XPath dies tut. –

+0

@ msmith1114 Vergessen Sie nicht, die Antwort zu akzeptieren, wenn dies die Dinge für Sie beschleunigt. –

Verwandte Themen