Protractor: Terapkan elementNotToBeCovered untuk perpustakaan ExpectedConditions

Dibuat pada 7 Jul 2015  ·  48Komentar  ·  Sumber: angular/protractor

PRs plz! easy untriaged user experience feature request

Komentar yang paling membantu

+1

Semua 48 komentar

Sangat membutuhkan ini. Itu akan memecahkan masalah besar

Ini adalah masalah kami di globaleaks yang berurusan dengan pemuat aplikasi dan operasi asinkron.

+1

Sangat membutuhkan ini untuk pop up dan overlay yang muncul di bagian atas halaman, ExpectedConditions.elementToBeClickable tidak membantu dalam kasus ini...

Iya ini! Saya terus-menerus mengalami _"Elemen tidak dapat diklik pada titik (x,y). Elemen lain akan menerima kesalahan klik:"_ setelah menggulir dan mencoba mengklik elemen.. tetapi hanya menyukai ~14% dari waktu.. membuat frustrasi. Bahkan menunggu elementVisible atau elementToBeClickable tidak selalu berhasil.

+1

+1

+1

Saya ingin melihat fungsi ini dirilis ASAP. Masalah ini sangat mengganggu. Apakah ada solusi untuk itu?

+1

+1

+1

+1

@sjelin Anda menyebutkan bahwa ini bisa dilakukan di utas lain, bukan?

We would address this using document.elementFromPoint and element.getBoundingClientRect pretty easily actually. elementFromPoint isn't totally standard at this point, though it appears to be supported by all browsers. The consistency issue is real though. Donno if we should leave this the way it is or "fix" it

+1000000000

+999

+2000000

+2000000

+999

+1

+1

+1

+1
EDIT: Maaf kalau begitu. Saya telah melihatnya sebagai praktik yang cukup umum di tempat lain untuk memilih masalah dengan +1 dan ini adalah masalah yang saya jalankan banyak menulis tes busur derajat jadi saya akan tertarik untuk melihatnya diimplementasikan. Aku akan mengingat itu untuk masa depan sekalipun.

Tolong hentikan +{number} PR ini. Ini tidak membantu...

Ada pembaruan tentang ini?
Untuk kasus penggunaan saya, saya menggunakan yang berikut ini untuk menggulir elemen ke tampilan, tetapi saya tahu ini bukan solusi untuk semua kasus penggunaan seperti modals dan semacamnya.

var el = $('.myElement');
browser.executeScript('arguments[0].scrollIntoView()', el.getWebElement());

Kami telah mengembangkan solusi untuk saat ini. Kami mengidentifikasi elemen ( id="spinner" ) yang "memblokir" elemen yang sebenarnya ingin kami klik dan hanya menunggu elemen pemblokiran tidak terlihat seperti:
broswer.wait(EC.invisibilityOf($(‘#spinner’)), 5000)

EC.invisibilityOf tidak selalu cukup. Terkadang Busur Derajat melaporkan suatu elemen sebagai tercakup oleh elemen lain yang seharusnya tidak terlihat.

Misalnya, dalam salah satu pengujian saya, tautan dilaporkan dicakup oleh div induknya, dan invisibilityOf akan menunggu selamanya. Mendukung keinginan untuk toNotBeCoveredBy

Masalah ini berumur 2 tahun. Apakah sudah ada solusi untuk ini, karena saya tidak dapat menemukannya dan saya masih mengalami masalah ini? Dalam situasi saya, saya tidak bisa menunggu elemen menjadi tidak terlihat, karena elemen penutup tidak akan terlihat pada titik mana pun dan tidak menutupi elemen secara visual, tetapi saya masih mendapatkan kesalahan karena tidak dapat diklik pada titik, karena elemen lain akan menerima klik.

+1 untuk "toNotBeCoveredBy"

Saya telah memecahkan masalah seperti itu dalam satu kasus dengan yang berikut:

"use strict";

function elementWithAttributeHasNotValue(htmlElement, attribute, value) {
    return htmlElement.getAttribute(attribute).then((elementAttribute) => {
        return !elementAttribute.includes(value);
    });
}

class Helper {
    waitForAngularInRoomAnimationToBeDone() {
        const inRoomElement = element(by.className("in-room"));

        browser.wait(elementWithAttributeHasNotValue(inRoomElement, "class", "ng-animate"), browser.params.DEFAULT_TIMEOUT_MS);
    }
}

module.exports = Helper;

Nama metode dan konstanta spesifik dari kasus penggunaan saya, tetapi saya pikir sisanya dapat digunakan dengan cara yang lebih umum.

Kemudian dalam pengujian saya, saya menggunakannya seperti ini:

helper.waitForAngularInRoomAnimationToBeDone();

Masalahnya adalah bahwa dalam situasi saya, ketika saya melihat tangkapan layar kesalahan, yang menangkap keadaan layar browser pada saat kesalahan, semuanya terlihat baik-baik saja dan elemen yang ingin saya klik terlihat, tetapi Busur Derajat adalah masih melaporkan bahwa elemen tidak dapat diklik, karena yang lain akan menerima klik dan menunggu elemen terlihat atau diaktifkan tidak berfungsi karena elemen sudah terlihat di layar dan diaktifkan. Saya memiliki masalah ini di Chrome dan tidak muncul setiap saat, hanya seperti 20% dari waktu. Saya mencoba kode di atas, tetapi tidak berhasil untuk saya.

@MihailSeykov Saya telah menemukan bahwa jika ada animasi, tangkapan layar mungkin diambil menjelang akhir animasi dan sepertinya elemen tersebut tidak terlihat padahal sebenarnya ada. Anda dapat menggunakan EC.and untuk menunggu invisibilityOf beberapa elemen yang mungkin menutupi elemen tersebut

Terkadang elemen masih akan terlihat, tetapi di tempat lain setelah animasi

Saya menghargai semua kerja keras yang diberikan pengembang untuk proyek sumber terbuka (saya mencoba dan melakukannya ketika saya bisa).

Tapi,... Saya benar-benar tidak mengerti mengapa ini bukan default/blok/masalah yang paling penting untuk diselesaikan. Saya tidak dapat menulis tes apa pun tanpa banyak tidur untuk menunggu item disembunyikan atau terlihat di dom. Saya telah mencoba banyak kombinasi dari wait for invisibility atau wait for visibility... tetapi tidak dapat menulis tes yang bukan peretasan retas.

Saya tidak mengerti mengapa semua orang tidak memiliki masalah visibilitas ini.

Ini sudah lebih dari 2 tahun dan masih belum diperbaiki??! Sangat PENTING untuk menguji tanpa peretasan, tolong perbaiki secepatnya!

Apakah ada kemajuan dalam hal itu :)
Saya meskipun, saya akhirnya memiliki obat untuk masalah saya

Bisakah kita memiliki beberapa umpan balik tentang ini. Apakah seseorang melihatnya atau tidak akan pernah diperbaiki? Ini menyebabkan banyak masalah bagi banyak orang ...

Sejauh yang saya tahu itu tidak ada di peta jalan. Namun untuk dapat mencoba mencari solusi untuk masalah ini alangkah baiknya jika kita memiliki contoh project dan contoh Kode Busur Derajat untuk “membuktikan” dimana letak permasalahan yang sebenarnya. Apakah itu mungkin?

Saya juga banyak membaca di komentar tentang masalah dengan menggulir ke elemen dan dalam beberapa kasus masih gagal. Ini mungkin ada hubungannya dengan fakta bahwa menggulir itu sendiri juga membutuhkan waktu, tetapi karena itu, proyek contoh akan sangat bagus!

Siapa yang bisa memberi kita itu?

Saya ingin menambahkan itu untuk saya, ini juga masalah no.1 yang saya miliki dengan Selenium. Sangat menjengkelkan bahwa Anda harus menunggu, dll. untuk memperhitungkan animasi.

Saya telah menulis metode utilitas cek kecil, perlu diingat itu akan segera mengklik elemen ketika dapat diklik:

import { ElementFinder, promise } from 'protractor';
export let testHelpers = {
  isClickable(el: ElementFinder): promise.Promise<boolean> {
    return new promise.Promise(resolve => {
      let interval = setInterval(() => {
        el.click().then(() => {
          clearInterval(interval);
          setTimeout(() => {
            resolve(true);
          }, 500);
        }, () => { });
      }, 100);
    });
  }
}

Dalam kode pengujian Anda:

import { testHelpers } from '../src/core/e2e/helpers';
describe('App', () => {
  it('should do something', () {
    let btn = $('.cls');
    browser.wait(testHelpers.isClickable(btn), 3000);
  });
});

Solusi saya adalah, sebelum mengklik elemen, menghapus dari DOM elemen yang menutupi elemen yang ingin saya klik.
await browser.executeScript("arguments[0].remove();", coverElement);

Kami hampir berusia 3 tahun ... apakah fitur yang diminta ini tidak dapat dipecahkan dari dalam _Protractor_?
Pengujian kami memiliki sleep untuk memperhitungkan animasi yang memblokir kemampuan klik elemen

@nmfernandes Saya pikir ini mungkin sedikit kurang dramatis tetapi masih berfungsi untuk menggunakan arguments[0].style.visibility='hidden'; . Tetapi bagaimanapun juga, ide Anda sangat membantu. Terima kasih telah berbagi.

Hampir 4 tahun, bisakah kita memiliki ini? Sangat tidak nyaman untuk membuat tidur pendek di antara interaksi hanya untuk mengatasi masalah ini. Selain itu, sleeps mengakumulasi banyak waktu yang saya (dan saya yakin banyak orang juga) ingin hindari.

Apakah ada yang punya kode di mana saya dapat mensimulasikan masalah ini? Jika memungkinkan, berikan saya repositori github untuk hanya mengkloning dan mengeksekusi.

Saya sangat ragu bahwa tim Busur Derajat dapat melakukan apa pun tentang ini. Bagi saya sepertinya ada masalah dengan Selenium atau Chromedriver.

  • 1

Membatalkan penetapan diri karena saya tidak lagi bekerja untuk Google

Saya membuat fungsi pembantu menggunakan async / menunggu sendiri yang mengambil 1 atau 2 argumen sebagai input, elem dan
retryCount . Fungsinya adalah mencoba mengklik elemen setiap 0,5 detik dan jika ada kesalahan yang muncul, dia mencoba mengklik lagi hingga retryCount habis atau tombol diklik.

export const clickOnElementWithRetry = async (elem: ElementFinder, retryCount: number = 5) => {

    while (retryCount) {
        try {
            await elem.click();
            retryCount = 0;
        }
        catch (e) {
            if(retryCount === 0)
                throw "Couldn't click element";
            await browser.sleep(500);
            retryCount--;   
        }
    }

}

Dalam file spesifikasi atau di mana pun Anda ingin menggunakannya:

import { clickOnElementWithRetry } from './helpers/';
it('Clicks on some element', async () => {

    const someButton = element(by.id("someElementId"));
    clickOnElementWithRetry(someButton)
})
Apakah halaman ini membantu?
0 / 5 - 0 peringkat