2016-04-19 18 views
2

Ich versuche, Tests in Ruby mit den neuesten Watir-Webdriver 0.9.1, Selenium-Webdriver 2.53.0 und Chrome-Erweiterung 2.21 zu automatisieren. Allerdings hat die Website, die ich testen, statische Kopfzeilen an der Spitze oder manchmal statische Fußzeilen an der Unterseite. Da Watir ein Element automatisch in die Ansicht scrollt, bevor es darauf klickt, werden die Elemente unter der statischen Kopfzeile oder der statischen Fußzeile verborgen. Ich möchte sucess_capabitlites (ElementScrollBehavior) nicht auf 1 oder 0 setzen, da die zu testenden Websites sowohl statische Header als auch statische Fußzeilen oder beides haben können.Watir-Webdriver wirft 'nicht klickbaren' Fehler, auch wenn Element sichtbar ist, vorhanden

Daher die Frage sind 1) Warum wirft Watir eine Ausnahme "Element nicht anklickbar", auch wenn das Element sichtbar und vorhanden ist? Siehe Ruby-Code (Ich habe eine zufällige Unternehmenswebsite für ein Beispiel ausgewählt) und die Ergebnisse unten.

2) Wie kann ich dies beheben, ohne auf ElementScrollBehaviour zurückzugreifen?

Ruby-Code:

require 'watir-webdriver' 

browser = Watir::Browser.new :chrome 

begin 
    # Step 1 
    browser.goto "shop.coles.com.au/online/mobile/national" 

    # Step 2 - click on 'Full Website' link at the bottom 
    link = browser.link(text: "Full website") 

    #check if link exists, present and visible? 
    puts link.exists? 
    puts link.present? 
    puts link.visible? 

    #click on link 
    link.click 

rescue => e 
    puts e.inspect 
ensure 
    sleep 5 
end 

puts browser.url 
browser.close 

Ergebnis:

$ Rubin link_not_clickable.rb

wahr wahr wahr

Selen :: WebDriver :: Fehler :: Unknown: unbekannt Fehler: Element kann nicht an Punkt geklickt werden (460, 1295). Andere Element erhalten würde den Klick: div class = "shoppingFooter" ... div

(Session info: chrom = 50.0.2661.75) (Fahrerinfo: chromedriver = 2.21.371459 (36d3d07f660ff2bc1bf28a75d1cdabed0983e7c4), Plattform = Mac OS X 10.10.5 x86_64)> http://shop.coles.com.au/online/mobile/national

danke!

+0

Ich habe versucht, Ihren Code, es funktioniert auf meinem Rechner. Wie wäre es mit Firefox anstatt Chrome? – Finks

+0

Der Fehler bedeutet im Grunde, dass etwas überlagert ist, auf das geklickt werden soll, um stattdessen den Klick zu erhalten. Wenn das Ding etwas enthält, auf das Sie klicken möchten, versuchen Sie es stattdessen. Andernfalls müssen Sie so scrollen, dass die andere Sache nicht mehr über dem, was Sie versuchen zu klicken ist. –

+0

@Finks. Firefox funktioniert auch für mich, vielleicht, weil es standardmäßig nach oben scrollt. Chrome scrollt standardmäßig nach unten, daher werden Fußzeilen über dem Element eingeblendet, auf das ich klicken möchte. – GregF

Antwort

1

Sie können ein Element anklicken, ohne es sichtbar zu machen. Check this out:

link.fire_event('click') 

ABER Es ist sehr sehr sehr nicht gute Entscheidung, soweit sie auf das Element, auch wenn es eigentlich nicht sichtbar oder im Fall ist, wenn es einfach unmöglich ist, es zu klicken (weil von gebrochenen Sticky Footer zum Beispiel).

Deshalb viel besser die Fooler zu warten, blättern Sie die Seite und dann wie klicken:

browser.div(id: "footerMessageArea").wait_until_present 
browser.execute_script("window.scrollTo(0, document.body.scrollHeight);") 
link.click 
1

Die sticky footer blockiert Webdriver von der Durchführung des Klicks, daher die Nachricht, dass "anderes Element den Klick erhalten würde".

Es gibt verschiedene Möglichkeiten, wie Sie das umgehen können.

  1. Blättern Sie zum unteren Rand der Seite vor dem Klick
  2. ausblenden/löschen die klebrige Fußzeile vor jeder/alle Link klickt
  3. Fokus auf ein Element unter dem Element, das Sie klicken, bevor Sie das ausführen Klicken Sie auf
0

Ich denke, Ihr Element ist auf dem Bildschirm sichtbar.

Bevor Sie auf das Element klicken, scrollen Sie zuerst die Webseite, so dass das Element sichtbar ist, und führen Sie den Klick aus. Ich hoffe, es sollte funktionieren.

0

ich ähnliches Problem hatte, Ich habe gerade verwendet Javascript-Code folgenden mit watir:

link = browser.link(text: "Full website") 
@browser.execute_script("arguments[0].focus(); arguments[0].click();", link) 
+0

Klicken mit js funktioniert auch ohne 'focus()'. Ich denke, es überschreibt Sichtbarkeitskontrollen, die sonst vom Browser durchgeführt werden, daher ist IMO nicht immer eine gute Idee. – akostadinov

0

Manchmal muss ich .click! was ich glaube ist das Fire_event gleichwertig. Im Grunde ist etwas seltsam überlagert, und man muss nur um das Front End Chaos herumgehen.