Elemen Kesalahan StaleElementReference tidak ditemukan di cache

Saya menggunakan Capybara 2.1 dengan Ruby 1.9.3 menggunakan driver Selenium (dengan Minitest dan Test Unit) untuk menguji aplikasi web.

Saya berjuang dengan masalah StaleElementReferenceException. Saya telah melihat cukup banyak diskusi tentang topik tersebut tetapi saya belum dapat menemukan solusi atas masalah yang saya hadapi.

Jadi pada dasarnya, saya mencoba menemukan semua elemen penomoran halaman di halaman saya menggunakan kode ini:

pagination_elements = page.all('.pagination a')

Lalu saya melakukan beberapa pernyataan pada elemen-elemen tersebut seperti:

pagination_elements.first.must_have_content('1')

Setelah pernyataan tersebut, saya melanjutkan pengujian dengan mengklik link Halaman Berikutnya untuk memastikan bahwa elemen penomoran halaman pertama saya di masa mendatang adalah Halaman Sebelumnya. Untuk melakukan itu saya mengambil elemen pagination lagi:

new_pagination_elements = page.all('.pagination a')

Dan Kesalahan Basi terjadi di sini, karena saya mencapai elemen yang telah saya capai. ( Ini kesalahannya )

Anda dapat melihat status tautan di sini.

Saya benar-benar tidak tahu bagaimana membuat tes umum ini berfungsi dengan baik. Apakah Anda punya tip tentang cara yang lebih baik untuk menjangkau elemen penomoran halaman saya?


person Evers    schedule 27.08.2013    source sumber
comment
Silakan lihat github.com/jnicklas/capybara/issues/843   -  person Rajarshi Das    schedule 27.08.2013
comment
@RajarshiDas Saya sudah membaca topik ini dan topik terkait, tetapi ini adalah masalah yang sangat lama, dari Capybara versi sebelumnya, dan itu tidak membantu masalah saya.   -  person Evers    schedule 27.08.2013


Jawaban (5)


Saya kadang-kadang mempunyai beberapa masalah dengan halaman intensif AJAX, dalam kasus saya solusi ini menyelesaikannya:

begin
  ...
rescue Selenium::WebDriver::Error::StaleElementReferenceError
  sleep 1
  retry
end
person ejosafat    schedule 27.08.2013

Saya melihat pesan utama pada intinya adalah:

Element not found in the cache - 
perhaps the page has changed since it was looked up

Saya punya kasus serupa sebelumnya. Ada dua solusi:

  1. Tambahkan page.reload sebelum memeriksa hal yang sama di halaman baru, jika Anda telah menyetel Capybara.automatic_reload = false di spec_helper

  2. find elemen khusus di halaman baru yang tidak dimiliki halaman sebelumnya. Efek ini setara dengan menunggu.

Metode lain adalah dengan menggunakan pemilih tertentu. Misalnya, sebagai ganti

pagination_elements = page.all('.pagination a')

Menggunakan

pagination_elements = page.all('#post_123 .pagination a')

Tambahkan area id unik ke pemilih dan Anda tidak akan menemui masalah seperti itu.

person Billy Chan    schedule 27.08.2013
comment
Saya ingin menghindari penggunaan page.reload karena pengujian integrasi saya mengikuti alur pengguna, dan memuat ulang halaman bukan bagian darinya. - person Evers; 27.08.2013
comment
@Evers, tidak ada yang salah di sini. Pengaturan defaultnya adalah true, jadi setiap tindakan akan memuat ulang konten, Anda hanya belum menyadarinya. Saya selalu menyetelnya false karena saya menggunakan Javascript untuk sering berinteraksi. Lupakan bagian ini jika Anda tidak memiliki pengaturan seperti itu di spec_helper - person Billy Chan; 27.08.2013
comment
Namun paksaan ke reload dapat membantu jika Anda memeriksa hal yang sama dua kali. Layak untuk dicoba. - person Billy Chan; 27.08.2013
comment
Terima kasih! Ini berfungsi dengan cukup baik sekarang! Menambahkan ID unik adalah cara yang lebih baik untuk melakukannya. Meluncurkan pengujian khusus ini 10 kali hanya menghasilkan satu pengujian yang gagal. Jadi masih belum 100% akurat. - person Evers; 27.08.2013

Tautan menarik tentang kesalahan ini dan cara memperbaikinya: http://stefan.haflidason.com/testing-with-rails-and-capybara-methods-that-wait-method-that-wont/

person Ben Colon    schedule 19.03.2015

Ternyata, selain kondisi balapan, error ini juga muncul akibat penyalahgunaan within blok. Misalnya:

within '.edit_form' do
  click '.edit_button'
  # The error will appear here if the 'edit_button' is not a
  # descendant of the 'edit_form'
end
person art-solopov    schedule 12.04.2016
comment
itu kasusku! Saya terkunci di dalam blok within yang menyebabkan kesalahan palsu pada objek basi di dalamnya - yang basi bukanlah yang saya #find, melainkan blok itu sendiri! - person igorsantos07; 26.04.2017

Pernahkah Anda mencoba menggunakan WebDriver secara langsung daripada melalui Capybara? Ini berpotensi memberi Anda kontrol lebih besar tentang kapan dan kapan tidak menyimpan objek dalam cache.

misalnya (Permintaan maaf untuk sintaks Java tetapi harus mendapatkan idenya)

WebElement searchField = driver.findElement(By.CssSelector("input.foo"));

searchField.click();

searchField.sendKeys("foo foo");

System.out.println(searchField.getText());

//Do something elsewhere on the page which causes html to change (e.g. submit form)

.....
....

//This next line would throw stale object

System.out.println(searchField.getText());

//This line will not throw exception

searchField = driver.findElement(By.CssSelector("input.foo"));

System.out.println(searchField.getText());

Menetapkan "findElement" lagi ke "searchField" berarti kita menemukan kembali elemen tersebut. Mengetahui kapan harus dan kapan tidak menetapkan ulang adalah kunci untuk memutuskan bagaimana cara menyimpan elemen web Anda dalam cache.

Saya belum pernah menggunakan Capybara, tapi saya berasumsi itu menyembunyikan strategi caching dari Anda?

person Robbie Wareham    schedule 27.08.2013
comment
Kami sudah menggunakan Capybara pada proyek kami yang lain dan kami tidak mempertimbangkan untuk kembali ke Webdriver itu sendiri. Kapibara menghemat banyak waktu. Tapi Anda benar, kapibara punya strategi caching, dan masih banyak lagi :) - person Evers; 27.08.2013
comment
Saya akan pindah ke Ruby dan mencoba memutuskan perpustakaan mana yang akan digunakan. Hal seperti inilah yang membuat saya berpikir akan langsung menggunakan Webdriver saja. Saya terlalu suka memegang kendali untuk menggunakan sesuatu seperti Capybara - person Robbie Wareham; 27.08.2013
comment
Saya seorang pembela Selenium Webdrivers yang hebat, tetapi saya harus mengakui bahwa Capybara sangat bagus untuk menunggu elemen dll ... Membiarkan Anda fokus pada pengujian Anda. - person Evers; 28.08.2013