Driver Web Selenium & Java. Elemen tidak dapat diklik pada titik (x, y). Elemen lain akan menerima klik


91

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);
}

Apakah Anda menggunakan Chrome versi 61+?
demouser123

@ demouser123 saya menggunakan Firefox 47.0.1 dan seleniumWebDriver 2.51.0
Maria

@ Maria Di baris mana Anda mendapatkan kesalahan? Terima kasih
DebanjanB

@DebanjanB Sejalan: driver.findElement (By.id ("navigationPageButton")). Click ();
Maria

Kesalahan itu berarti, ada elemen lain yang melapisi elemen target (hamparan posisi tetap / absolut) atau indeks-z terlalu rendah. Ini mungkin disebabkan oleh efek hover yang menggunakan transisi (lebih lambat dari batas waktu minimum, dalam hal ini 393ms). Anda harus menunggu #navigationPageButtonhingga terlihat (atau dapat diklik menggunakan elementToBeClickable()elemen itu juga) atau memeriksa apakah semua prasyarat terpenuhi sehingga tombol dapat diklik.
coba-tangkap-akhirnya

Jawaban:


192

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:

  • 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

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 waitsebagai WebDriverWait wait = new WebDriverWait(driver, 10);tetapi Anda memanggil click()metode pada elemen sebelum ExplicitWaitmasuk ke dalam permainan seperti di until(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 ActionsKelas:

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 JavascriptExecutoruntuk 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 ExpectedConditionsset ke elementToBeClickableagar 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 ExplicitWaitdengan ExpectedConditionsset ke invisibilityOfElementLocatedagar 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 JavascriptExecutoruntuk mengirim klik langsung ke elemen.

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

1
Ke # 6 / # 2 di atas: Metode .ExecuteScript sekarang dapat diakses dari driver web itu sendiri daripada dari JavascriptExecutor. Terima kasih atas jawaban yang ditulis dengan baik!
Tabrock

6
Anda telah membahas banyak kemungkinan di mana hanya 5 dan 6 yang merupakan cara yang benar untuk menangani kesalahan yang disebutkan. Empat yang pertama melempar kesalahan yang berbeda yang solusi yang Anda berikan tidak akan berfungsi. Untuk contoh poin nomor 3 sebenarnya adalah masalah elemen basi yang tidak akan berfungsi meskipun berapa lama Anda menunggu dengan metode elementToBeClickble. Itu harus ditangani secara berbeda.
Rajagopalan

6 tidak benar-benar memperbaikinya; sebuah retasan untuk mengatasi masalah tersebut, 5 akan benar jika kondisi yang diharapkan yang benar digunakan. 4 sepertinya satu-satunya jawaban yang benar.
Ardesco

1
Satu hal penting untuk diperhatikan adalah, ketika kita meniru tindakan pengguna, mungkin sangat tidak diinginkan menggunakan javascript untuk mengklik elemen yang tidak dapat diklik sama sekali (# 6). Pengguna akhir tidak akan pernah melakukannya, mereka hanya akan menggulir ke elemen untuk membawanya ke area pandang atau menutup hamparan apa pun (jika diizinkan oleh laman) untuk berinteraksi dengannya.
p_champ

17

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);

Bekerja! Saya tidak bisa membayangkan cara kerjanya, tetapi selain itu klik pada lapisan overlay (menunggu overlay ditutup oleh 'invisibilityOfElementLocated' membutuhkan waktu sekitar 30 detik).
Fisk

Bisakah Anda menulis penjelasan lengkap karena saya menulis di java dan itu tidak akrab perang, dapatkah Anda memberikan aliran lengkap?
Bastian

4

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 elementFromPointDOM 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

2

Anda dapat mencoba

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

Itu tidak membantu saya.
Maria

Ya: org.openqa.selenium.WebDriverException: Elemen tidak dapat diklik pada titik (36, 72). Elemen lain akan menerima klik: <div tabindex = "0" class = "waiter-ui-lock"> </div> Durasi perintah atau waktu tunggu: 70 milidetik
Maria

1
coba yang berikut iniWebElement element = driver.findElement(By.id("navigationPageButton")); Actions actions = new Actions(driver); actions.moveToElement(element).click().perform();
fg78nc

Itu tidak membantu juga. Saya memiliki dua Pengecualian dan satu AssertionError dan berikutnya beberapa kesalahan "Elemen tidak dapat diklik pada titik"
Maria

1
Jika saya menggunakan Thread.Sleep, maka semua berfungsi. Tetapi saya menggunakan Tunggu semua gagal.
Maria

2

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


0

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;
        }
    }
}

0

Di C #, saya mengalami masalah dengan pemeriksaan RadioButton, dan ini berhasil untuk saya:

driver.ExecuteJavaScript("arguments[0].checked=true", radio);

0

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();
    }
Dengan menggunakan situs kami, Anda mengakui telah membaca dan memahami Kebijakan Cookie dan Kebijakan Privasi kami.
Licensed under cc by-sa 3.0 with attribution required.