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);
}
Dies ist eine typische org.openqa.Selenium.WebDriverException die Java.lang.RuntimeException erweitert.
Die Felder dieser Ausnahme sind:
protected static final Java.lang.String BASE_SUPPORT_URL
public static final Java.lang.String DRIVER_INFO
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)
.
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);
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);
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
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
Du kannst es versuchen
WebElement navigationPageButton = (new WebDriverWait(driver, 10))
.until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton")));
navigationPageButton.click();