Saya menggunakan waktu tunggu eksplisit dan saya mendapat peringatan:
org.openqa.selenium.WebDriverException: Elemen tidak dapat diklik pada titik (36, 72). Elemen lain akan menerima klik: ... Durasi perintah atau batas waktu: 393 milidetik
Jika saya menggunakan, Thread.sleep(2000)
saya tidak menerima peringatan apa pun.
@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
hingga terlihat (atau dapat diklik menggunakanelementToBeClickable()
elemen itu juga) atau memeriksa apakah semua prasyarat terpenuhi sehingga tombol dapat diklik.Jawaban:
WebDriverException: Elemen tidak dapat diklik pada titik (x, y)
Ini adalah org.openqa.selenium.WebDriverException khas yang memperluas java.lang.RuntimeException .
Bidang pengecualian ini adalah:
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
Tentang kasus penggunaan individu Anda, kesalahan memberitahu semuanya:
WebDriverException: Element is not clickable at point (x, y). Other element would receive the click
Jelas dari blok kode Anda bahwa Anda telah mendefinisikan
wait
sebagaiWebDriverWait wait = new WebDriverWait(driver, 10);
tetapi Anda memanggilclick()
metode pada elemen sebelumExplicitWait
masuk ke dalam permainan seperti diuntil(ExpectedConditions.elementToBeClickable)
.Larutan
Kesalahan
Element is not clickable at point (x, y)
dapat muncul dari berbagai faktor. Anda dapat mengatasinya dengan salah satu prosedur berikut:1. Elemen tidak diklik karena adanya JavaScript atau panggilan AJAX
Coba gunakan
Actions
Kelas:WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().build().perform();
2. Elemen tidak diklik karena tidak berada dalam Viewport
Coba gunakan
JavascriptExecutor
untuk membawa elemen dalam Viewport:WebElement myelement = driver.findElement(By.id("navigationPageButton")); JavascriptExecutor jse2 = (JavascriptExecutor)driver; jse2.executeScript("arguments[0].scrollIntoView()", myelement);
3. Halaman diperbarui sebelum elemen dapat diklik.
Dalam hal ini induksi ExplicitWait yaitu WebDriverWait seperti yang disebutkan di poin 4.
4. Elemen ada di DOM tapi tidak bisa diklik.
Dalam kasus ini, induksi ExplicitWait dengan
ExpectedConditions
set keelementToBeClickable
agar elemen dapat diklik:WebDriverWait wait2 = new WebDriverWait(driver, 10); wait2.until(ExpectedConditions.elementToBeClickable(By.id("navigationPageButton")));
5. Elemen ada tetapi memiliki Overlay sementara.
Dalam kasus ini, induksi
ExplicitWait
denganExpectedConditions
set keinvisibilityOfElementLocated
agar Overlay tidak terlihat.WebDriverWait wait3 = new WebDriverWait(driver, 10); wait3.until(ExpectedConditions.invisibilityOfElementLocated(By.xpath("ele_to_inv")));
6. Elemen ada tetapi memiliki Overlay permanen.
Gunakan
JavascriptExecutor
untuk mengirim klik langsung ke elemen.WebElement ele = driver.findElement(By.xpath("element_xpath")); JavascriptExecutor executor = (JavascriptExecutor)driver; executor.executeScript("arguments[0].click();", ele);
sumber
Jika Anda perlu menggunakannya dengan Javascript
Kita bisa menggunakan argumen [0] .click () untuk mensimulasikan operasi klik.
var element = element(by.linkText('webdriverjs')); browser.executeScript("arguments[0].click()",element);
sumber
Saya mengalami kesalahan ini saat mencoba mengklik beberapa elemen (atau hamparannya, saya tidak peduli), dan jawaban lainnya tidak berfungsi untuk saya. Saya memperbaikinya dengan menggunakan
elementFromPoint
DOM API untuk menemukan elemen yang Selenium ingin saya klik sebagai gantinya: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()
Saya juga mengalami situasi di mana elemen bergerak , misalnya karena elemen di atasnya pada halaman sedang melakukan animasi perluasan atau penciutan. Dalam hal ini, kelas Kondisi yang Diharapkan ini membantu. Anda memberikan elemen yang dianimasikan , bukan yang ingin Anda klik. Versi ini hanya berfungsi untuk animasi 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
sumber
Anda dapat mencoba
WebElement navigationPageButton = (new WebDriverWait(driver, 10)) .until(ExpectedConditions.presenceOfElementLocated(By.id("navigationPageButton"))); navigationPageButton.click();
sumber
WebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
Menggulir halaman ke titik terdekat yang disebutkan dalam pengecualian melakukan trik bagi saya. Di bawah ini adalah potongan kode:
$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);");
CATATAN: Saya menggunakan Facebook php webdriver
sumber
Solusi terbaik adalah mengganti fungsionalitas klik:
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; } } }
sumber
Di C #, saya mengalami masalah dengan pemeriksaan
RadioButton
, dan ini berhasil untuk saya:driver.ExecuteJavaScript("arguments[0].checked=true", radio);
sumber
Dapat mencoba dengan kode di bawah ini
WebDriverWait wait = new WebDriverWait(driver, 30);
Lulus elemen lain akan menerima klik :
<a class="navbar-brand" href="#"></a>
boolean invisiable = wait.until(ExpectedConditions .invisibilityOfElementLocated(By.xpath("//div[@class='navbar-brand']")));
Lulus id tombol yang dapat diklik seperti yang ditunjukkan di bawah ini
if (invisiable) { WebElement ele = driver.findElement(By.xpath("//div[@id='button']"); ele.click(); }
sumber