Debugging "Elemen tidak dapat diklik pada titik" kesalahan

397

Saya melihat ini hanya di Chrome.

Pesan kesalahan lengkap berbunyi:

"org.openqa.selenium.WebDriverException: Elemen tidak dapat diklik pada titik (411, 675). Elemen lain akan menerima klik: ..."

Elemen yang 'akan menerima klik' adalah di samping elemen yang dimaksud, bukan di atasnya dan tidak tumpang tindih, tidak bergerak di sekitar halaman.

Saya telah mencoba menambahkan offset, tetapi itu tidak berhasil. Item ada di jendela yang ditampilkan tanpa perlu menggulir.

pengguna1591169
sumber
2
Apakah Anda menunggu halaman dimuat? Mungkin elemen lain tumpang tindih saat halaman dimuat?
Herokiller
55
Singkat cerita untuk mereka yang baru tiba - UNSUR TIDAK TERLIHAT DI HALAMAN DAN OLEH KARENA ITU TIDAK DICARI. ANDA PERLU MENGIKUTI VIEWPORT OLEH EMITTING window.ScrollTo.
Chris B. Behrens
67
@ ChrisB.Behrens Ini tidak selalu terjadi. Kesalahan khusus ini juga dapat diberikan ketika suatu elemen ditutupi oleh yang lain. Saya memiliki pengecualian ini ketika mencoba mengklik tombol yang sedang elemen lain dengan posisi tetap.
Martin Cassidy
4
Tidak hanya Chromedriver- memiliki masalah yang sama dengan Firefox. Saya memperbaiki masalah dengan menerapkan penundaan untuk menunggu hingga halaman telah dimuat ulang sepenuhnya, seperti yang disarankan oleh orang lain di atas.
codervince
5
Saya pikir ini adalah saran yang benar-benar salah untuk memancarkan scrollTo atau menunggu. Sepertinya algoritma klik selenium adalah: 1. menghitung posisi elemen 2. gulir ke posisi ini (jadi Anda tidak perlu mengeluarkannya sendiri) 3. klik ke posisi ini (pengecualian berasal dari pernyataan terakhir yang memeriksa elemen apa yang ada pada ini posisi sesaat sebelum pengiriman peristiwa klik yang sebenarnya). Saran saya adalah: 1. periksa apakah elemen ada di dalam viewport Anda. 2. periksa apakah elemen dicakup oleh yang lain (seperti menu lengket), sembunyikan jika ada, atau gulir secara manual sebelum mengklik tanpa mengandalkan builtin scrollTo.
Vitalik Verhovodov

Jawaban:

325

Ini disebabkan oleh 3 jenis berikut:

1. Elemen tidak terlihat untuk diklik.

Gunakan Tindakan atau JavascriptExecutor untuk membuatnya mengklik.

Berdasarkan Tindakan:

WebElement element = driver.findElement(By("element_path"));

Actions actions = new Actions(driver);

actions.moveToElement(element).click().perform();

Oleh JavascriptExecutor:

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("scroll(250, 0)"); // if the element is on top.

jse.executeScript("scroll(0, 250)"); // if the element is on bottom.

atau

JavascriptExecutor jse = (JavascriptExecutor)driver;

jse.executeScript("arguments[0].scrollIntoView()", Webelement); 

Kemudian klik pada elemen.

2. Halaman disegarkan sebelum mengklik elemen.

Untuk ini, buat halaman menunggu selama beberapa detik.

3. Elemen dapat diklik tetapi ada spinner / overlay di atasnya

Kode di bawah ini akan menunggu hingga hamparan menghilang

By loadingImage = By.id("loading image ID");

WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);

wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

Kemudian klik pada elemen.

Prabu Ananthakrishnan
sumber
52
Ada jenis penyebab ketiga, yaitu elemen Anda terbungkus dalam div atau span. Halaman dapat dimuat sepenuhnya, dan sepenuhnya dalam viewport, tetapi Chromedriver akan menolak untuk mengkliknya, di mana driver web untuk FF dan IE tidak memiliki masalah. Manusia nyata tidak memiliki petunjuk bahwa rentang itu ada, dan peramban tidak peduli ketika Anda mengkliknya, sebagai manusia. Tidak bergerak atau menunggu tidak akan menyelesaikan masalah ini; baik menghindari Chrome / chromedriver, atau menulis ulang HTML halaman tampaknya menjadi satu-satunya pilihan bagi orang-orang dalam kasus 3.
Don Simon
54
@ DonSimon Saya punya masalah yang sama yang Anda lakukan. Saya dapat mengatasinya dengan menggunakan .SendKeys (Keys.Return) alih-alih .Click. Ini bekerja untuk saya di Chrome di mana saya mengalami masalah ini dan di Firefox di mana saya mengalami masalah serupa lainnya pada tautan khusus ini (jangkar terbungkus Div).
Peter Bernier
17
Solusi yang disarankan oleh @PeterBernier bekerja dengan baik dalam kasus di mana elemen dibungkus dalam div atau span. Dalam Python saya menggunakan .send_keys ('\ n') untuk mensimulasikan klik dan mengatasi masalah di Chrome.
GJ
4
Jika suatu elemen disembunyikan oleh elemen div, kode berikut memperbaikinya. executeJavascript ("argumen [0] .click ();", selenium.findElement (locator));
EsotericNonsense
Anda juga bisa menunggu elemen diklik. wait.Until (ExpectedConditions.ElementToBeClickable (webElement));
Chielus
67

Anda juga dapat menggunakan klik JavaScript dan menggulir tidak akan diperlukan saat itu.

IJavaScriptExecutor ex = (IJavaScriptExecutor)Driver;
ex.ExecuteScript("arguments[0].click();", elementToClick);
Bart Wojtala
sumber
5
Luar biasa! Saya bertanya-tanya mengapa selenium tidak membuang metode klik () yang mereka berikan, mengingat bahwa ada kondisi di mana isDisplayed () dan isEnabled () tidak cukup untuk mengeklik elemen, dan ini sepertinya satu-satunya solusi. Terima kasih!
Giovanni Bitliner
2
+1: Ini adalah solusi yang bekerja untuk saya. actions.MoveToElementtidak berfungsi untuk saya dalam C # dan solusi pengguliran lainnya tampak agak rapuh karena ada kemungkinan pengguliran mungkin tidak benar melihat elemen atau posisi elemen pada halaman dapat berubah.
Pengguna
1
solusi ini adalah yang termudah jika elemen tidak dalam tampilan, tetapi ada di halaman
Yashveer Rana
@Giovanni Bitliner Mereka tidak menyediakan metode ini karena ini bukan skenario pengguna nyata. Pengguna juga harus menunggu hingga loader hilang. Saya pikir itu hal yang luar biasa tentang selenium.
Gideon Mulder
+1 Juga bekerja untuk saya. Baru saja menambahkan metode flwg ke kode saya: `private void jsClick (elemen IWebElement, driver IWebDriver) {IJavaScriptExecutor ex = (IJavaScriptExecutor) driver; ex.ExecuteScript ("argumen [0] .click ();", elemen); } `dipanggil dengan cara ini: 'jsClick (driver.FindElement (By.XPath (" xpathOfTheElement "))); `
Jeremias
46

Tampaknya ada bug di chromedriver untuk itu (masalahnya adalah itu ditandai tidak akan diperbaiki) -> GitHub Link

( Tempatkan hadiah pada FreedomSponsors mungkin?)

Ada solusi yang disarankan di komentar # 27. Mungkin itu akan bekerja untukmu-

Tony Lâmpada
sumber
4
Tampak adil - jika tombol tidak di layar maka itu tidak benar-benar dapat diklik.
Evan Knowles
Ini bukan bug. Ini adalah perilaku yang dimaksudkan dan itu benar. Seperti yang disarankan lainnya, jika elemen di luar viewport - Anda perlu menggulir ke sana.
Alex Skrypnyk
Saya mencoba Firefox dan ternyata tidak memberikan kesalahan ini, namun kliknya tetap diabaikan. Ternyata div induk memiliki ketinggian nol. Setelah itu diperbaiki keduanya bekerja dengan baik.
dansalmo
35

Saya memiliki masalah yang sama, mencoba semua solusi yang ditawarkan tetapi mereka tidak bekerja untuk saya. akhirnya saya menggunakan ini:

JavascriptExecutor js = (JavascriptExecutor) driver;
js.executeScript("var evt = document.createEvent('MouseEvents');" + "evt.initMouseEvent('click',true, true, window, 0, 0, 0, 0, 0, false, false, false, false, 0,null);" + "arguments[0].dispatchEvent(evt);", findElement(element));

Semoga ini membantu

XGillerX
sumber
16

Saya telah melihat ini dalam situasi ketika jendela Chrome yang didorong selenium dibuka terlalu kecil. Elemen yang akan diklik keluar dari viewport dan karenanya gagal.

Kedengarannya logis ... pengguna sungguhan harus mengubah ukuran jendela atau gulir sehingga memungkinkan untuk melihat elemen dan bahkan mengkliknya.

Setelah menginstruksikan driver selenium untuk mengatur ukuran jendela dengan tepat masalah ini hilang untuk saya. API webdriver diuraikan di sini .

opichals
sumber
15

Wow, banyak jawaban di sini, dan banyak yang bagus.

Saya harap saya akan menambahkan sesuatu dari pengalaman saya ini.

Baiklah teman-teman, dalam kasus saya ada overlay cookie menyembunyikan elemen sesekali. Menggulir ke elemen juga berfungsi; tetapi menurut pendapat saya yang sederhana (untuk kasus saya, bukan obat mujarab untuk semua orang) solusi paling sederhana adalah dengan masuk ke layar penuh (saya menjalankan skrip saya pada 3/4 dari jendela layar)! Jadi di sini kita mulai:

driver.manage().window().maximize();

Semoga itu bisa membantu!

Xwris Stoixeia
sumber
13

ruby / watir-webdriver / chrome

Saya menggunakan trik berikut dan sepertinya berhasil:

#scroll to myelement
@browser.execute_script "window.scrollTo(#{myelement.element.wd.location[0]},#{myelement.element.wd.location[1]})"

# click myelement
myelement.when_present.fire_event("click")
Annet
sumber
1
Masalah yang saya lihat adalah dengan peta area. Kesalahannya sama dengan posting asli di sini - div "di depan" area yang perlu saya klik. Itu bukan masalah beban AJAX / waktu / halaman, dan daerah itu dalam tampilan penuh - saya bahkan tidak bisa gulir untuk fokus pada itu. Namun, mengubah metode klik saya dari object.click ke object.fire_event ("klik") tampaknya telah menyelesaikan masalah bagi saya. Saya meninggalkannya di blok begin / rescue sehingga tidak akan mempengaruhi bagaimana Firefox mengklik secara normal.
adam reed
Pendekatan ini mengatasi masalah saya ketika ada elemen yang tidak terlihat di viewport.
Jason R. Coombs
13

Saya juga bergulat dengan masalah ini. Kode berfungsi dengan baik di FF, gagal di Chrome. Apa yang saya coba lakukan adalah mengklik kotak centang - jika tidak ada dalam tampilan, saya akan gulir untuk melihat dan kemudian klik. Bahkan menggulir ke tampilan berfungsi di Chrome, hanya beberapa piksel bagian bawah kotak centang tidak terlihat sehingga webdriver menolak mengkliknya.

Solusi saya adalah ini:

WebElement element = _sectorPopup.findElement(...);

((Locatable) element).getCoordinates().inViewPort();
try {
    element.click();
} catch (Exception e) {
    new Actions(getWebDriver()).sendKeys(Keys.PAGE_DOWN).perform();
    element.click();
}

Chrome juga memiliki masalah dengan sendKeys, menggunakan Tindakan terkadang diperlukan. Tentunya, Anda perlu tahu arah mana dan seberapa banyak Anda harus pergi sehingga jarak tempuh Anda dapat bervariasi. Tapi saya lebih suka ini daripada hack javascript, jadi saya mempostingnya di sini kalau-kalau ada orang lain yang merasa berguna.

kolibri
sumber
Locatable sudah usang.
Steve Staple
12

Saya mendapatkan kesalahan ini saat menjalankan tes tanpa kepala dengan xvfb-run. Mereka bekerja dengan sempurna secara lokal. Menggunakan chrome, versi webdriver / chromedriver / chrome / java dll semuanya identik.

Bug 'tidak akan diperbaiki' di chromedriver - GitHub Link yang ditunjukkan oleh Tony Lâmpada menyarankan ini mungkin terkait dengan apa yang / tidak terlihat di layar.

Pesan bantuan untuk xvfb-run menunjukkan berikut ini:

-s ARGS   --server-args=ARGS    arguments (other than server number and
                                "-nolisten tcp") to pass to the Xvfb server
                                (default: "-screen 0 640x480x8")

Mengubah resolusi untuk xvfb membuat kesalahan hilang:

xvfb-run -s "-screen 0 1280x1024x16" ...
u-phoria
sumber
9

Saat menggunakan busur derajat ini membantu saya:

var elm = element(by.css('.your-css-class'));
browser.executeScript("arguments[0].scrollIntoView();", elm.getWebElement());
elm.click();
Gal Bracha
sumber
8

Pertama, cobalah untuk mendapatkan driver Chrome terbaru dan periksa apakah itu menyelesaikan masalah.

Dalam kasus saya, itu tidak memperbaiki masalah. Tetapi, solusi berikut ini bekerja untuk saya sejauh ini. Berikut ini adalah kode C # tetapi Anda dapat mengikuti logika yang sama dalam bahasa spesifik Anda. Apa yang kami lakukan di sini adalah,

Langkah 1: Fokus pada elemen menggunakan objek Tindakan Selenium,

Langkah 2: Kemudian lakukan klik pada elemen

Langkah 3: Jika ada pengecualian, maka kami memicu acara "Klik" javascript pada elemen dengan menjalankan skrip javascript melalui metode "ExecuteScript" driver browser Selenium.

Anda juga dapat melewati langkah 1 dan 2 dan hanya mencoba langkah 3 juga. Langkah 3 akan bekerja sendiri tetapi saya perhatikan beberapa perilaku aneh dalam satu skenario di mana langkah 3, meskipun berhasil mengklik elemen, menyebabkan perilaku tak terduga di bagian lain dari kode saya setelah mengklik elemen.

            try
            {
                //Setup the driver and navigate to the web page...
                var driver = new ChromeDriver("folder path to the Chrome driver");
                driver.Navigate().GoToUrl("UrlToThePage");

                //Find the element...
                var element = driver.FindElement(By.Id("elementHtmlId")); 

                //Step 1
                new Actions(driver).MoveToElement(element).Perform();  

                //Step 2
                element.Click();
            }
            catch (Exception)
            {
                //Step 3
                driver.ExecuteScript("document.getElementById('elementHtmlId').click();");

            }
Sujeewa
sumber
Saya mengalami masalah yang sama. Langkah 1 Anda menggunakan kelas Actions bekerja dengan sangat baik. Saya tidak akan pernah memikirkan hal ini. Terima kasih!
Conner
Langkah pertama Anda adalah solusi yang bagus.
Sovandara LENG
7

Saya membuat metode ini berdasarkan komentar dari jawaban Tony Lâmpada. Ini bekerja dengan sangat baik.

def scroll_to(element)
  page.execute_script("window.scrollTo(#{element.native.location.x}, #{element.native.location.y})")
end
Roger Garza
sumber
6

Saya mendapatkan masalah yang sama saat menjalankan skrip selenium dengan python. Inilah yang saya gunakan untuk mengklik elemen:

from selenium.webdriver.common.action_chains import ActionChains


ActionChains(driver).click(element).perform()
psr
sumber
5

Saya menghadapi masalah yang sama ketika saya harus memeriksa dua kotak centang satu demi satu. Tapi saya mendapatkan error.hence yang sama di atas saya menambahkan menunggu di antara langkah-langkah saya untuk memeriksa kotak centang .... itu bekerja dengan baik dan hebat. berikut adalah langkah-langkahnya: -

  When I visit /administrator/user_profiles
  And I press xpath link "//*[@id='1']"
  Then I should see "Please wait for a moment..."
  When I wait for 5 seconds
  And I press xpath link "//*[@id='2']"
  Then I should see "Please wait for a moment..."
  When I visit /administrator/user_profiles_updates
Milind
sumber
Hanya menambahkan bahwa ini bukan cara yang tepat untuk menggunakan sintaks Gherkin. Langkah-langkah harus dalam bentuk "diberikan - kapan - kemudian" dan ini tidak boleh dicampur. Jika lebih banyak "ketika" diperlukan setelah "kemudian", mungkin dibutuhkan test case terpisah.
Floella
5

Anda perlu menggunakan fokus atau gulir pada elemen itu. Anda juga mungkin harus menggunakan tunggu tunggu.

WebElement firstbutton= driver.findElement(By.xpath("Your Element"));
Actions actions = new Actions(driver);
actions.moveToElement(element);
actions.perform();

ATAU

Elemen tidak dapat diklik karena Spinner / Overlay di atasnya:

By loadingImage = By.id("loading image ID");
WebDriverWait wait = new WebDriverWait(driver, timeOutInSeconds);
wait.until(ExpectedConditions.invisibilityOfElementLocated(loadingImage));

ATAU

Point p= element.getLocation();
Actions actions = new Actions(driver);
actions.moveToElement(element).movebyoffset(p.x,p.y).click().perform();

ATAU

Jika masih tidak berfungsi gunakan JavascriptExecutor

JavascriptExecutor executor = (JavascriptExecutor)driver;
executor.executeScript("arguments[0].click();", firstbutton);
Shubham Jain
sumber
3

Tampaknya ini adalah hasil dari bug "Won't Fix" di biner driver Chrome.

Salah satu solusi yang bekerja untuk saya (Mileage May Vary May) dapat ditemukan dalam diskusi Grup Google ini, Komentar # 3:

https://groups.google.com/forum/?fromgroups=#!topic/selenium-developer-activity/DsZ5wFN52tc

Bagian yang relevan ada di sini:

Sejak itu saya telah mengatasi masalah ini dengan menavigasi langsung ke href jangkar induk rentang.

driver.Navigate (). GoToUrl (driver.FindElement (By.Id (embeddedSpanIdToClick)). FindElement (By.XPath ("..")). GetAttribute ("href"));

Dalam kasus saya, saya menggunakan Python, jadi setelah saya mendapatkan elemen yang diinginkan, saya hanya menggunakan

driver.get(ViewElm.get_attribute('href'))

Saya berharap ini hanya berfungsi, jika elemen yang Anda coba klik adalah tautan ...

alpheus
sumber
3

Saya menghadapi masalah yang sama dengan clj-webdriver (clojure port of Selenium). Saya baru saja menerjemahkan solusi sebelumnya ke clojure untuk kenyamanan. Anda dapat memanggil fungsi ini sebelum melakukan klik atau apa pun untuk menghindari masalah itu.

(defn scrollTo
  "Scrolls to the position of the given css selector if found"
  [q]
  (if (exists? q) 
    (let [ loc (location-once-visible q) jscript (str "window.scrollTo(" (:x loc) "," (:y loc) ")") ] 
      (execute-script jscript))))
Jaime Agudo
sumber
3

Ini mungkin terjadi jika elemen berubah posisi saat driver mencoba mengkliknya (saya pernah melihat ini dengan IE). Pengemudi mempertahankan posisi awal tetapi pada saat ia benar-benar mengkliknya, posisi itu tidak lagi menunjuk ke elemen itu. Pengandar FireFox tidak memiliki masalah ini BTW, tampaknya itu "klik" elemen pemrograman.

Bagaimanapun, ini dapat terjadi ketika Anda menggunakan animasi atau hanya mengubah ketinggian elemen secara dinamis (misalnya $("#foo").height(500)). Anda perlu memastikan bahwa Anda hanya mengklik elemen setelah tingginya "menetap". Saya berakhir dengan kode yang terlihat seperti ini (C # binding):

if (!(driver is FirefoxDriver))
{
    new WebDriverWait(driver, TimeSpan.FromSeconds(10)).Until(
        d => d.FindElement(By.Id(someDynamicDiv)).Size.Height > initialSize);
}

Jika terjadi animasi atau faktor lain yang tidak dapat Anda tanyakan dengan mudah, Anda dapat menggunakan metode "generik" yang menunggu elemen tersebut diam:

var prevLocation = new Point(Int32.MinValue, Int32.MinValue);
int stationaryCount = 0;
int desiredStationarySamples = 6; //3 seconds in total since the default interval is 500ms
return new WebDriverWait(driver, timeout).Until(d => 
{
    var e = driver.FindElement(By.Id(someId));
    if (e.Location == prevLocation)
    {
        stationaryCount++;
        return stationaryCount == desiredStationarySamples;
    }

    prevLocation = e.Location;
    stationaryCount = 0;
    return false;
});
Ohad Schneider
sumber
Sepertinya ini yang saya alami. Saya sebentar-sebentar mendapatkan pengecualian "Other Element would ..." OP, tetapi tangkapan layar menunjukkan modal ada di layar dan elemen tidak tercakup dan saya menggunakan menunggu sebelum mengklik. Ternyata ketika modal saya mengklik terbuka itu sebenarnya slide ke bawah halaman. Tergantung pada saat selenium menunggu sampel DOM yang sebenarnya, pengecualian dapat dilemparkan jika ia menangkap modal saat bergerak.
Levi Noecker
3

Saya bertemu ini karena dialog pemuatan mencakup pada elemen ini. Saya secara sederhana menyelesaikannya dengan menambahkan menunggu sebelum bekerja dengan elemen ini.

try {
        Thread.sleep((int) (3000));
    } catch (InterruptedException e) {
        //
        e.printStackTrace();
    }

Semoga bantuan ini!

Huy Hóm Hỉnh
sumber
3

Penjelasan pesan kesalahan :

Pesan kesalahan hanya mengatakan, bahwa elemen yang ingin Anda klik ada, tetapi tidak terlihat. Itu bisa ditutupi oleh sesuatu atau sementara tidak terlihat.

Mungkin ada banyak alasan mengapa elemen tersebut tidak terlihat pada saat tes. Harap analisis kembali halaman Anda dan temukan solusi yang tepat untuk kasus Anda.

Solusi untuk kasus tertentu :

Dalam kasus saya, kesalahan ini terjadi, ketika tooltip elemen layar yang baru saja saya klik, muncul di atas elemen yang ingin saya klik berikutnya. Defocus adalah solusi yang saya butuhkan.

  • Solusi cepat bagaimana cara memfokuskan kembali adalah dengan mengklik ke beberapa elemen lain di bagian lain dari layar yang melakukan "tidak ada" resp. tidak ada yang terjadi setelah tindakan klik.
  • Solusi yang tepat adalah memanggil element.blur()elemen pop tooltip, yang akan membuat tooltip hilang.
Dee
sumber
3

Alasan untuk kesalahan ini adalah bahwa elemen yang Anda coba klik tidak ada di viewport (wilayah dilihat oleh pengguna) dari browser. Jadi cara untuk mengatasinya adalah dengan menggulir ke elemen yang diinginkan terlebih dahulu kemudian melakukan klik.

Javascript:

async scrollTo (webElement) {
    await this.driver.executeScript('arguments[0].scrollIntoView(true)', webElement)
    await this.driver.executeScript('window.scrollBy(0,-150)')
}

Jawa:

public void scrollTo (WebElement e) {
    JavascriptExecutor js = (JavascriptExecutor) driver; 
    js.executeAsyncScript('arguments[0].scrollIntoView(true)', e)
    js.executeAsyncScript('window.scrollBy(0,-150)')
}
sri
sumber
2

Jawaban Re Tony Lâmpada, komentar # 27 memang memecahkan masalah bagi saya, kecuali bahwa itu memberikan kode Java dan saya membutuhkan Python. Berikut adalah fungsi Python yang menggulir ke posisi elemen dan kemudian mengkliknya.

def scroll_to_and_click(xpath):
    element = TestUtil.driver.find_element_by_xpath(xpath)
    TestUtil.driver.execute_script('window.scrollTo(0, ' + str(element.location['y']) + ');')
    element.click()

Ini memecahkan masalah bagi saya di Chrome 34.0. Itu tidak menyebabkan kerusakan di Firefox 28.0 dan IE 11; browser tersebut tidak mengalami masalah, tetapi menggulir ke posisi elemen sebelum mengkliknya masih bukan hal yang buruk.

Steve Saporta
sumber
2

Mungkin itu bukan solusi yang benar-benar bersih tetapi berfungsi:

try:
    el.click()
except WebDriverException as e:
    if 'Element is not clickable at point' in e.msg:
        self.browser.execute_script(
            '$("{sel}").click()'.format(sel=el_selector)
        )
    else:
        raise
radeklos
sumber
2

Saya mendapatkan bug ini karena saya menguji hover dan kemudian perlu mengklik tautan di bawah tooltip. Solusinya adalah menambahkan page.find('.sp-logo').hoversebelum click_linkuntuk mendapatkan tooltip keluar dari jalan.

Dan Kohn
sumber
2

Itu lucu, sepanjang waktu saya habiskan melihat berbagai tanggapan, tidak ada yang mencoba yang jelas, yang tentu saja, saya juga tidak. Jika halaman Anda memiliki id yang sama digunakan beberapa kali, seperti yang saya lakukan, ("newButton",) dan yang Anda inginkan bukan yang pertama ditemukan, maka Anda kemungkinan besar akan mendapatkan kesalahan ini. Hal termudah untuk dilakukan (C #):

var testIt = driver.FindElements(By.Id("newButton"));

Perhatikan itu FindElements, bukan FindElement.

Dan kemudian uji untuk melihat berapa banyak hasil yang muncul dari pengambilan. Jika yang kedua, Anda dapat menggunakan:

testit[1].Click();

Atau dapatkan id yang digunakan kembali untuk memperbaikinya.

CargoMeister
sumber
Jika ini karena ada beberapa tombol dengan ID itu dan hanya satu yang ditampilkan pada satu waktu, solusi superior melibatkan penggunaan LINQ untuk menemukan elemen pertama yang terlihat (tambahkan .First(x => x.Visible)ke panggilan FindElements) dan klik pada itu jika bukan nol.
Sean Duggan
2

Setelah menguji semua saran yang disebutkan, tidak ada yang berhasil. Saya membuat kode ini. Itu bekerja, tetapi tidak indah

public void click(WebElement element) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            element.click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}

public void click(String css) {
    //https://code.google.com/p/selenium/issues/detail?id=2766 (fix)
    while(true){
        try{
            driver.findElement(By.cssSelector(css)).click();
            break;
        }catch (Throwable e){
            try {
                Thread.sleep(200);
            } catch (InterruptedException e1) {
                e1.printStackTrace();
            }
        }
    }
}
Bruno Lee
sumber
2

Saya melakukan semacam klik kasar dan itu berfungsi untuk saya.

try:
    elem.click()
except:
    print "failed to click"
    size = elem.size
    mid_of_y = int(size["height"])/2
    stepts_to_do_to_left = int(size["width"])
    while stepts_to_do_to_left > 0:
        try:
            print stepts_to_do_to_left, mid_of_y
            action = webdriver.common.action_chains.ActionChains(driver)
            action.move_to_element_with_offset(elem, mid_of_y, stepts_to_do_to_left)
            action.click()
            action.perform()
            print "DONE CLICK"
            break
        except:
            pass
Super Mario
sumber
2

Jika Anda telah jQuerymemuat pada halaman, Anda dapat menjalankan perintah javascript berikut:

"$('#" + element_id + "').click()"

Contoh menggunakan python executor:

driver.execute_script("$('#%s').click()" % element_id)
Zags
sumber
1

Saya memiliki masalah yang sama dan itu disebabkan oleh konflik id antara div dan tautan di dalam div. Jadi pengemudi mengklik div bukan tautan yang saya inginkan. Saya mengubah id id dan itu berfungsi dengan baik.

Sebelum:

<div id="logout"><a id="logout" href="logoutLink">logout</a></div>

Setelah:

<div id="differentId"><a id="logout" href="logoutLink">logout</a></div>
Jordan Silva
sumber
Tidak kaget yang menyebabkan masalah Anda. Seharusnya hanya ada satu id pada satu halaman. Itu adalah desain yang buruk dan bukan solusi.
Dave Lawrence
1

Di Drupal saat menggunakan Selenium :

    // Get element.
    $element = $this->driver->getElement('xpath=//input');        
    // Get screen location.
    $location = $element->getLocation();
    // To make sure that Chrome correctly handles clicking on the elements 
    // outside of the screen, we must move the cursor to the element's location.
    $this->driver->moveCursor($location['x'], $location['y']);

    // Optionally, set some sleep time (0.5 sec in the example below) if your
    // elements are visible after some animation.
    time_nanosleep(0, 500000000);

    // Click on the element.
    $element->click();
Alex Skrypnyk
sumber