Użyłem jawnego czekania i mam ostrzeżenie:
org.openqa.selenium.WebDriverException: Elementu nie można kliknąć w punkcie (36, 72). Inny element otrzyma kliknięcie: ... Czas trwania lub limit czasu polecenia: 393 milisekundy
Jeśli używam Thread.sleep(2000)
, nie otrzymuję żadnych ostrzeżeń.
@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);
}
#navigationPageButton
aż stanie się widoczny (lub klikalny, używając równieżelementToBeClickable()
dla tego elementu) lub sprawdź, czy wszystkie warunki wstępne są spełnione, aby przycisk był klikalny.Odpowiedzi:
WebDriverException: elementu nie można kliknąć w punkcie (x, y)
Jest to typowy wyjątek org.openqa.selenium.WebDriverException, który rozszerza wyjątek java.lang.RuntimeException .
Pola tego wyjątku to:
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
O Twoim indywidualnym przypadku użytkowania, błąd mówi wszystko:
WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
Z bloku kodu jasno wynika, że zdefiniowałeś
wait
as,WebDriverWait wait = new WebDriverWait(driver, 10);
ale wywołujeszclick()
metodę na elemencie, zanimExplicitWait
wejdzie do gry, jak wuntil(ExpectedConditions.elementToBeClickable)
.Rozwiązanie
Błąd
Element is not clickable at point (x, y)
może wynikać z różnych czynników. Możesz się z nimi skontaktować, korzystając z jednej z następujących procedur:1. Element nie jest klikany z powodu wywołań JavaScript lub AJAX
Spróbuj użyć
Actions
klasy:WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().build().perform();
2. Element nie jest klikany, ponieważ nie znajduje się w rzutni
Spróbuj użyć,
JavascriptExecutor
aby przenieść element do rzutni:WebElement myelement = driver.findElement(By.id("navigationPageButton")); JavascriptExecutor jse2 = (JavascriptExecutor)driver; jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. Strona jest odświeżana, zanim element stanie się klikalny.
W takim przypadku wywołaj ExplicitWait, czyli WebDriverWait, jak wspomniano w punkcie 4.
4. Element jest obecny w DOM, ale nie można go kliknąć.
W tym przypadku indukuj ExplicitWait z
ExpectedConditions
ustawioną na,elementToBeClickable
aby element był klikalny:WebDriverWait wait2 = new WebDriverWait(driver, 10); wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5. Element jest obecny, ale ma tymczasową nakładkę.
W takim przypadku indukuj
ExplicitWait
zExpectedConditions
ustawieniem na,invisibilityOfElementLocated
aby nakładka była niewidoczna.WebDriverWait wait3 = new WebDriverWait(driver, 10); wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. Element jest obecny, ale ma trwałą nakładkę.
Służy
JavascriptExecutor
do wysyłania kliknięcia bezpośrednio na element.WebElement ele = driver.findElement(By.xpath("element_xpath")); JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", ele);
źródło
Na wypadek, gdybyś musiał go używać z JavaScriptem
Możemy użyć argumentów [0] .click () do symulacji operacji kliknięcia.
var element = element(by.linkText('webdriverjs')); browser.executeScript("arguments[0].click()",element);
źródło
Napotkałem ten błąd podczas próby kliknięcia jakiegoś elementu (lub jego nakładki, nie obchodziło mnie to), a inne odpowiedzi nie działały dla mnie. Naprawiłem to, używając
elementFromPoint
DOM API, aby znaleźć element, który Selenium chciał, abym zamiast tego kliknął: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()
Miałem również sytuacje, w których element się poruszał , na przykład dlatego, że element znajdujący się nad nim na stronie wykonywał animowane rozwijanie lub zwijanie. W takim przypadku pomogła ta klasa oczekiwanego warunku. Dajesz mu elementy, które są animowane , a nie te, które chcesz kliknąć. Ta wersja działa tylko dla animacji jQuery.
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
źródło
Możesz spróbować
WebElement navigationPageButton = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton"))); navigationPageButton.click();
źródło
WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
Przewinięcie strony do najbliższego punktu wspomnianego w wyjątku załatwiło sprawę. Poniżej znajduje się fragment kodu:
$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);");
UWAGA: używam webdrivera php na Facebooku
źródło
Najlepszym rozwiązaniem jest zastąpienie funkcji kliknięcia:
public void _click(WebElement element){ boolean flag = false; while(true) { try{ element.click(); flag=true; } catch (Exception e){ flag = false; } if(flag) { try{ element.click(); } catch (Exception e){ System.out.printf("Element: " +element+ " has beed clicked, Selenium exception triggered: " + e.getMessage()); } break; } } }
źródło
W C # miałem problem ze sprawdzeniem
RadioButton
, a to zadziałało:driver.ExecuteJavaScript("arguments[0].checked=true", radio);
źródło
Można spróbować z poniższym kodem
WebDriverWait wait = new WebDriverWait(driver, 30);
Przekazanie innego elementu spowoduje kliknięcie :
<a class="navbar-brand" href="#"></a>
boolean invisiable = wait.until(ExpectedConditions .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));
Podaj identyfikator klikalnego przycisku, jak pokazano poniżej
if (invisiable) { WebElement ele = driver.findElement(By.xpath("//div[@id='button']"); ele.click(); }
źródło