wake-up-neo.net

Klicken auf Koordinaten ohne identifizierendes Element

Im Rahmen meines Selen-Tests für eine Anmeldefunktion möchte ich auf eine Schaltfläche klicken, indem sie ihre Koordinaten identifiziert und Selenium anweist, auf diese Koordinaten zu klicken. Dies würde geschehen, ohne das Element selbst zu identifizieren (über id, xpath usw.). 

Ich verstehe, dass es andere, effizientere Möglichkeiten gibt, einen Klickbefehl auszuführen, aber ich versuche, diesen Ansatz speziell zu verwenden, um die Benutzererfahrung am besten anzupassen. Vielen Dank.

16
Nathan Katz

Is eine Möglichkeit, dies zu tun. Mit der ActionChains-API können Sie den Mauszeiger über ein Element bewegen, um einen bestimmten Versatz (relativ zur Mitte des Elements) anpassen und dann auf diese Position klicken. So verwenden Sie den Webtreiber in Python:

elem = find_element_by_selector(selector)
ac = ActionChains(browser)
ac.move_to_element(elem).move_by_offset(x_off, y_off).click().perform()

Ihr alle seid viel zu schnell, um die Frage abzulehnen. Es gibt eine Reihe von Gründen, auf die Sie klicken müssen, anstatt auf ein Element zu klicken. In meinem Fall habe ich ein SVG-Balkendiagramm mit einem Overlay-Element, das alle Klicks erfasst. Ich möchte einen Klick über einen der Balken simulieren, aber da die Überlagerung dort ist, kann Selenium nicht auf das Element selbst klicken. Diese Technik wäre auch für Imagemaps von Nutzen.

27
Dirk Bergstrom

In der C # API verwenden Sie Aktionen

var element = driver.FindElement(By...);
new Actions(driver).MoveToElement(element).MoveByOffset(dx, dy).Click().Perform();

Obwohl es am besten ist, möglichst einfache Id-, CSS- und Xpath-Selektoren zu verwenden. Die Funktionalität ist jedoch bei Bedarf verfügbar (d. H. Klicken auf Elemente an bestimmten geografischen Orten auf Funktionalität).

16
craastad

Dies kann mit der Klasse Actions in Java geschehen.

Verwenden Sie folgenden Code -

new Actions(driver).moveByOffset(x coordinate, y coordinate).click().build().perform(); 

Hinweis: Selen 3 unterstützt die Klasse Actions für geckodriver nicht

Beachten Sie außerdem, dass x- und y-Koordinaten relative Werte von der aktuellen Mausposition sind. Angenommen, die Mauskoordinaten liegen zu Beginn bei (0,0). Wenn Sie absolute Werte verwenden möchten, können Sie die folgende Aktion sofort ausführen, nachdem Sie mit dem obigen Code darauf geklickt haben.

new Actions(driver).moveByOffset(-x coordinate, -y coordinate).perform();

10
NarendraR

Wenn Sie ein kommerzielles Add-On für Selenium als Option verwenden, ist dieses möglich: Angenommen, Ihr Button hat die Koordinaten x=123, y=456. Dann können Sie mit Helium auf das Element bei diesen Koordinaten wie folgt klicken:

from helium.api import *
# Tell Helium about your WebDriver instance:
set_driver(driver)
click(Point(123, 456))

(Ich bin einer von Heliums Autoren.)

4

Ich habe zuerst den JavaScript-Code verwendet, der erstaunlich gut funktioniert hat, bis eine Website nicht klickt.

Also habe ich diese Lösung gefunden:

Importieren Sie zunächst ActionChains für Python und aktivieren Sie es:

from Selenium.webdriver.common.action_chains import ActionChains
actions = ActionChains(driver)

Um auf einen bestimmten Punkt in Ihren Sitzungen zu klicken, gehen Sie folgendermaßen vor:

actions.move_by_offset(X coordinates, Y coordinates).click().perform()

HINWEIS: Der obige Code funktioniert nur, wenn die Maus nicht berührt wurde.

actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0))

Vollständig:

actions.move_to_element_with_offset(driver.find_element_by_tag_name('body'), 0,0)
actions.move_by_offset(X coordinates, Y coordinates).click().perform()
3
Romano

Dies funktionierte für mich in Java zum Anklicken von Koordinaten unabhängig von den Elementen.

Actions actions = new Actions(driver);
actions.moveToElement(driver.findElement(By.tagName("body")), 0, 0);
actions.moveByOffset(xCoordinate, yCoordinate).click().build().perform();

Die zweite Codezeile setzt den Cursor in die obere linke Ecke der Browseransicht und die letzte Zeile klickt auf die als Parameter angegebenen XY-Koordinaten.

2

In Selenium Java können Sie es mit Javascript versuchen:

WebDriver driver = new ChromeDriver();

if (driver instanceof JavascriptExecutor) {
	((JavascriptExecutor) driver).executeScript("el = document.elementFromPoint(x-cordinate, y-cordinate); el.click();");
}

1
Stackcraft_noob

Möglicherweise können Sie dies über iMacros http://www.iopus.com/iMacros/ tun.

1
Nilesh Tailor

Ich habe die Actions-Klasse wie oben aufgeführt verwendet, aber ich fand es hilfreich, wenn ich eine relative Position aus dem Element herausfinden musste, das ich mit Firefox Add-On Measurit verwendet habe, um die relativen Koordinaten zu ermitteln. Zum Beispiel:

        IWebDriver driver = new FirefoxDriver();
        driver.Url = @"https://scm.commerceinterface.com/accounts/login/?next=/remittance_center/";
        var target = driver.FindElement(By.Id("loginAsEU"));
        Actions builder = new Actions(driver);            
        builder.MoveToElement(target , -375  , -436).Click().Build().Perform();

Ich habe die -375, -436 erhalten, indem ich auf ein Element geklickt und dann rückwärts gezogen habe, bis ich den Punkt erreicht habe, den ich anklicken musste. Die Koordinaten, von denen MeasureIT sagte, dass ich sie gerade abgezogen habe. In meinem obigen Beispiel war das einzige Element, das ich auf der Seite anklickbar hatte, der Link "loginAsEu". Also bin ich von dort losgegangen.

1
user890332
import pyautogui
from Selenium import webdriver

driver = webdriver.Chrome(chrome_options=options)
driver.maximize_window() #maximize the browser window
driver.implicitly_wait(30)
driver.get(url)
height=driver.get_window_size()['height']

#get browser navigation panel height
browser_navigation_panel_height = driver.execute_script('return window.outerHeight - window.innerHeight;')

act_y=y%height
scroll_Y=y/height

#scroll down page until y_off is visible
try:
    driver.execute_script("window.scrollTo(0, "+str(scroll_Y*height)+")")
except Exception as e:
    print "Exception"
#pyautogui used to generate click by passing x,y coordinates
pyautogui.FAILSAFE=False
pyautogui.moveTo(x,act_y+browser_navigation_panel_height)
pyautogui.click(x,act_y+browser_navigation_panel_height,clicks=1,interval=0.0,button="left")

Das ist für mich gearbeitet. Hoffe, es wird für euch funktionieren:) ...

0

Aktionsketten können etwas wählerisch sein. Sie können dies auch erreichen, indem Sie Javascript ausführen.

self.driver.execute_script('el = document.elementFromPoint(440, 120); el.click();')
0
Cynic
    WebElement button = driver.findElement(By.xpath("//button[@type='submit']"));
    int height = button.getSize().getHeight();
    int width = button.getSize().getWidth();
    Actions act = new Actions(driver);
    act.moveToElement(button).moveByOffset((width/2)+2,(height/2)+2).click();
0