it-swarm.com.de

Selenium Webdriver und Java. Das Element kann an Punkt (x, y) nicht angeklickt werden. Anderes Element würde den Klick erhalten

Ich habe explizite Wartezeiten verwendet und habe die Warnung:

org.openqa.Selenium.WebDriverException: Element kann an Punkt (36, 72) nicht angeklickt werden. Ein anderes Element würde den Klick erhalten: ... Befehlsdauer oder Zeitüberschreitung: 393 Millisekunden

Wenn ich Thread.sleep(2000) verwende, erhalte ich keine Warnungen.

@Test(dataProvider = "menuData")
public void Main(String btnMenu, String TitleResultPage, String Text) throws InterruptedException {
    WebDriverWait wait = new WebDriverWait(driver, 10);
    driver.findElement(By.id("navigationPageButton")).click();

    try {
       wait.until(ExpectedConditions.elementToBeClickable(By.cssSelector(btnMenu)));
    } catch (Exception e) {
        System.out.println("Oh");
    }
    driver.findElement(By.cssSelector(btnMenu)).click();
    Assert.assertEquals(driver.findElement(By.cssSelector(TitleResultPage)).getText(), Text);
}
51
Maria

WebDriverException: Element kann an Punkt (x, y) nicht angeklickt werden

Dies ist eine typische org.openqa.Selenium.WebDriverException die Java.lang.RuntimeException erweitert.

Die Felder dieser Ausnahme sind:

  • BASE_SUPPORT_URL : protected static final Java.lang.String BASE_SUPPORT_URL
  • DRIVER_INFO : public static final Java.lang.String DRIVER_INFO
  • SESSION_ID : public static final Java.lang.String SESSION_ID

Über Ihren individuellen Verwendungszweck sagt der Fehler alles:

WebDriverException: Element is not clickable at point (x, y). Other element would receive the click 

Aus Ihrem Codeblock geht hervor, dass Sie wait als WebDriverWait wait = new WebDriverWait(driver, 10); definiert haben, jedoch die click() -Methode für das Element vor dem ExplicitWait aufrufen. kommt ins Spiel wie in until(ExpectedConditions.elementToBeClickable).

Lösung

Der Fehler Element is not clickable at point (x, y) kann von verschiedenen Faktoren herrühren. Sie können sie mit einem der folgenden Verfahren ansprechen:

1. Element wird aufgrund von JavaScript oder AJAX Aufrufe vorhanden nicht angeklickt

Versuchen Sie, Actions Class zu verwenden:

WebElement element = driver.findElement(By.id("navigationPageButton"));
Actions actions = new Actions(driver);
actions.moveToElement(element).click().build().perform();

2. Element wird nicht angeklickt, da es nicht innerhalb von Ansichtsfenster liegt

Versuchen Sie, das Element mit JavascriptExecutor in das Ansichtsfenster zu bringen:

WebElement myelement = driver.findElement(By.id("navigationPageButton"));
JavascriptExecutor jse2 = (JavascriptExecutor)driver;
jse2.executeScript("arguments[0].scrollIntoView()", myelement); 

3. Die Seite wird aktualisiert, bevor das Element anklickbar wird.

In diesem Fall induzieren Sie ExplicitWait d. H. WebDriverWait wie in Punkt 4 erwähnt.

4. Element ist im DOM vorhanden, aber nicht anklickbar.

In diesem Fall induzieren Sie ExplicitWait mit ExpectedConditions auf elementToBeClickable, damit das Element angeklickt werden kann:

WebDriverWait wait2 = new WebDriverWait(driver, 10);
wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));

5. Element ist vorhanden, hat jedoch eine temporäre Überlagerung.

In diesem Fall induzieren Sie ExplicitWait mit ExpectedConditions auf invisibilityOfElementLocated setzen, damit die Überlagerung nicht sichtbar ist.

WebDriverWait wait3 = new WebDriverWait(driver, 10);
wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));

6. Element ist vorhanden, hat aber permanente Überlagerung.

Verwenden Sie JavascriptExecutor, um den Klick direkt auf das Element zu senden.

WebElement ele = driver.findElement(By.xpath("element_xpath"));
JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", ele);
127
DebanjanB

Falls Sie es mit Javascript verwenden müssen

Wir können Argumente [0] .click () verwenden, um die Klickoperation zu simulieren.

var element = element(by.linkText('webdriverjs'));
browser.executeScript("arguments[0].click()",element);
11
Rester Test

Ich bin auf diesen Fehler gestoßen, als ich versucht habe, auf ein Element zu klicken (oder auf dessen Overlay, es war mir egal), und die anderen Antworten haben bei mir nicht funktioniert. Ich habe es mit der DOM-API elementFromPoint behoben, um das Element zu finden, auf das Selenium stattdessen klicken soll:

element_i_care_about = something()
loc = element_i_care_about.location
element_to_click = driver.execute_script(
    "return document.elementFromPoint(arguments[0], arguments[1]);",
    loc['x'],
    loc['y'])
element_to_click.click()

Ich hatte auch Situationen, in denen ein Element bewegt war, zum Beispiel, weil ein Element darüber auf der Seite eine animierte Erweiterung oder Reduzierung ausführte. In diesem Fall hat diese Expected Condition-Klasse geholfen. Sie geben das Elemente, die animiert sind an, nicht die, auf die Sie klicken möchten. Diese Version funktioniert nur für jQuery-Animationen.

class elements_not_to_be_animated(object):
    def __init__(self, locator):
        self.locator = locator

    def __call__(self, driver):
        try:
            elements = EC._find_elements(driver, self.locator)
            # :animated is an artificial jQuery selector for things that are
            # currently animated by jQuery.
            return driver.execute_script(
                'return !jQuery(arguments[0]).filter(":animated").length;',
                elements)
        except StaleElementReferenceException:
            return False
3
rescdsk

Das Scrollen der Seite zu dem in der Ausnahme genannten nahe gelegenen Punkt hat mir geholfen. Unten ist ein Code-Schnipsel:

$wd_Host = 'http://localhost:4444/wd/hub';
$capabilities =
    [
        \WebDriverCapabilityType::BROWSER_NAME => 'chrome',
        \WebDriverCapabilityType::PROXY => [
            'proxyType' => 'manual',
            'httpProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'sslProxy' => PROXY_DOMAIN.':'.PROXY_PORT,
            'noProxy' =>  PROXY_EXCEPTION // to run locally
        ],
    ];
$webDriver = \RemoteWebDriver::create($wd_Host, $capabilities, 250000, 250000);
...........
...........
// Wait for 3 seconds
$webDriver->wait(3);
// Scrolls the page vertically by 70 pixels 
$webDriver->executeScript("window.scrollTo(0, 70);");

HINWEIS: Ich verwende Facebook PHP Webdriver

2
Sudheesh.M.S

Du kannst es versuchen

WebElement navigationPageButton = (new WebDriverWait(driver, 10))
 .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();
2
fg78nc