2016-07-19 4 views
0

Ich arbeite mit einer Website mit Pop-up-Tabellen. Wenn ein Benutzer zum Beispiel über einen Link schwebt oder klickt, wird ein kleines Popup mit einer Tabelle mit Daten angezeigt. Es gibt viele dieser Links auf derselben Seite. Beim Extrahieren von Daten aus den Tabellen wird jedes Popup sequenziell geöffnet und geschlossen, indem die Links der Reihe nach angeklickt werden.Selenium ChromeDriver Wie klickt man Elemente mit negativen x, y Pixelpositionen? C#

Zum Schließen eines Popup-Fensters klicken Sie auf ein kleines "X" in der oberen rechten Ecke des Popup-Fensters. Ungefähr 99% der Zeit ist dies kein Problem. In etwa 1% der Fälle befindet sich der obere Teil des Popup-Fensters jedoch über dem Bildschirm, mit einem negativen "y" -Pixel, das den Popup-Button "X" verdeckt - und wiederum negativ. y 'Pixelposition. Bei manueller Bedienung (Bewegen der Maus von Hand) kann ich die Größe des Chrome-Fensters ändern und das Popup wird wieder in das Fenster "einrasten", wobei mindestens ein "y" -Pixel von Null ist.

Ich konnte diese manuelle Neuzentrierung des Pop-ups mit Selenium-Befehlen nicht replizieren. Der nächste Befehl, den ich finden kann, ist MoveToElement, der manchmal funktioniert, aber andere nicht (ich kann nicht ergründen, warum ich Teilerfolg sehe, aber das ist ein Exkurs von dieser Frage).

Soweit ich das beurteilen kann, wird Selen es mir nicht erlauben, mit einem Element zu interagieren, das eine negative x- oder y-Pixelposition hat. Hier

ist, was ich bin derzeit versucht, mit mäßigem Erfolg:

// example begins with pop-up already displayed. Data has been extracted. 
// We are now ready to close the pop-up by clicking the 'X' button. 

// here we move to the table, otherwise the detail popup close button will be off screen. Warning: this works with partial success. 

var actions = new Actions(Session.Driver); 
actions.MoveToElement(table); 
actions.Perform(); 

// Must close unless the popup may (or may not) cover the next link. 
var closeButton = Session.Driver.FindElement(By.Id(id)) 
    .FindElements(By.CssSelector("a.cmg_close_button")) 
    .FirstOrDefault(); 
if (closeButton != null) 
{ 
    Wait.Until(d => closeButton.Displayed); 

    if (closeButton.Location.Y < 0 || closeButton.Location.X < 0) 
    { 
     Log.Error("Could not close button. The popup displayed the close_button off-screen giving it a negative x or y pixel location."); 
    } 
    else 
    { 
     closeButton.Click(); 
    } 
} 

Bitte geben Sie Strategien für den Umgang mit der negativen x, y Pixelposition des Popup-Fensters.

Ich verwende C# 4.6, Selenium 2.45, ChromeDriver (Chrome) und VS2015 CE IDE.

+0

Warum 'Sie nicht versuchen, mit' ExpectedConditions.ElementToBeClickable (By), die gibt Sie klickbares Element mit positiver Höhe und Breite. –

+0

@SaurabhGaur Was ist es über '.ElementToBeClickable()', das das Element zwingt, auf dem Schirm zu sein? – JeffC

+0

@Jeffc Nein, es ist nur zu prüfen, bis Element sichtbar und aktiviert, das heißt klickbar. –

Antwort

1

Es sieht aus wie die Seite nicht richtig die Position des Popup gesetzt, wenn der Link zu einer Grenze der Ansicht liegt.

Um dieses Problem zu überwinden, könnten Sie zunächst das gezielte Element bewegen mich über ihn in der Mitte der Ansicht zu, bevor er:

// scroll the link close to the center of the view 
Session.Driver.ExecuteScript(
    "arguments[0].scrollIntoView(true);" + 
    "window.scrollBy(-200, -200);" , 
    table); 

// move the mouse over 
new Actions(Session.Driver) 
    .MoveToElement(table) 
    .Perform(); 
+0

IJavaScriptExecutor javaScriptExecutor = Sitzung.Driver als IJavaScriptExecutor; javaScriptExecutor? .ExecuteScript ("Argumente [0] .scrollIntoView (true);" + "window.scrollBy (-200, -200);", table); – sapbucket

+0

Ich musste es ändern, um es zu funktionieren. Ich führe gerade einen vollen Test durch. Es läuft für ein paar Stunden. Finger gekreuzt ... – sapbucket

+0

Umwandlung in 'IJavaScriptExecutor' ist nur erforderlich, wenn der Treiber an die" IWebDriver "-Schnittstelle übergeben wird. Mit der Basisklasse: 'RemoteWebDriver driver = new ChromeDriver(); driver.ExecuteScript ('...'); ' –

0

Selen wurde entwickelt, um nur mit Elementen zu interagieren, die ein Benutzer kann. In den meisten Fällen trifft dies eher auf versteckte Elemente auf der Seite zu. Sie haben einen etwas seltenen Fall, in meiner Erfahrung, in der Ihr "verstecktes" Element von der Seite ist anstelle von display:none, etc.

Ein Weg um dies zu verwenden ist IJavaScriptExecutor. Dadurch können Sie JS-Code auf der Seite ausführen. HINWEIS: Wenn Sie versuchen, ein strenges Benutzerszenario einzuhalten, d. H. Nur Dinge, die ein Benutzer tun kann, ist dies nicht für Sie. Sie müssen weiterhin nach Möglichkeiten suchen, um das Popup auf dem Bildschirm wiederherzustellen.

Ich denke, wenn Sie Ihr Skript ändern, wie unten, sollte es funktionieren.

if (closeButton.Location.Y < 0 || closeButton.Location.X < 0) 
{ 
    IJavaScriptExecutor jse = Session.Driver as IJavaScriptExecutor; 
    jse.ExecuteScript("arguments[0].click()", closeButton); 
    // Log.Error("Could not close button. The popup displayed the close_button off-screen giving it a negative x or y pixel location."); 
} 
else 
{ 
    closeButton.Click(); 
} 
+0

@SaurabhGaur also warum der Downvote? – JeffC

+0

@SaurabhGaur Ich habe kein Problem damit, dass Leute meine Antworten ablehnen usw., wenn es einen guten Grund gibt ... und wenn es einen guten Grund gibt, würde ich gerne wissen, was es ist, damit ich es korrigieren oder zumindest darauf reagieren kann die Meinungsverschiedenheit. – JeffC

Verwandte Themen