kutish.until (kutilgan shartlar) seleniumda ishlamaydi

Hozirgacha selenyumun 2.45.0 versiyasidan foydalanardim va barcha kutishlar shu tarzda amalga oshirildi:

WebDriverWait wait = new WebDriverWait(webKitUtility.getWebDriver(), 5);
wait.until(ExpectedConditions.visibilityOfElementLocated(By.id("role")));

Lekin men selenyumni 3.1.0 ga o'zgartirdim va xatoni oldim:

"FluentWait tipidagi (Predicate) usul argumentlar uchun qo'llanilmaydi  (Kutilgan shart) "

Ko'rib turganingizdek, 2.45.0 dan 3.1.0 ga qadar ba'zi narsalar eskirgan. Men buni hozir nima qilishning eng yaxshi usuli ekanligini tekshirishga harakat qilaman, ammo ishonchim komil emas. Google'da topilgan narsalarimning ko'pi hozirgi kunga qadar men foydalanadigan usulni tushuntirib beradigan eski ma'lumotdir.

22

7 javoblar

Xuddi shu masala ham bor edi.

WebDriverWait .until() usulini ishlatib, va quyidagi maven pom.xml faylga qo'shib qo'yib qo'ydim:


      com.google.guava
      guava
      21.0

Bundan tashqari, mening kodim avvalgi kabi ko'rinadi.

Keyinchalik aniqroq bo'lish uchun ikkita .until() usullari mavjud.

The old one (which is deprecated):
public void until(final Predicate isTrue) {}

And the new one:
public V until(Function<? super T, V> isTrue) {}

25
qo'shib qo'ydi
Men rasmiy selenyum suhbat xonasiga bordim va u menga qilgan ishni qilishimni aytdi. Men uchun ham ishlaydi. Javobni yuborish uchun bu erga keldim, lekin siz allaqachon buni qildingiz :).
qo'shib qo'ydi muallif lijep dam, manba
Kimdir menga yangi narsani qanday ishlatish haqida bir misol keltirishi mumkinmi? Men haqiqiy dasturni nazarda tutyapman.
qo'shib qo'ydi muallif Bala, manba

Mustaqillikni qo'shish kerak bo'ladi:


        org.seleniumhq.selenium
        selenium-support
        3.0.1

Ushbu kod haligacha ishlash uchun. Oxir-oqibat, kodni ishlatmaslik uchun "FluentWait" ni qayta yozish kerak bo'ladi.

2
qo'shib qo'ydi
FluentWait, Selenyum 3.4.0 dan farqli ravishda bekor qilinmagan ko'rinadi.
qo'shib qo'ydi muallif seanf, manba

You can do something like this for the new FluentWait

    new WebDriverWait(driver, 60).until(new Function() {
    Boolean isWindowFound = Boolean.FALSE;
        @Override
        public Boolean apply(WebDriver driver) {
            try {
                driver.switchTo().window("Your Window Name");
                isWindowFound = Boolean.TRUE;
            } catch (NoSuchWindowException e) {
                System.out.println("Your Window Name not found");
                System.out.println(driver.getTitle());
                return isWindowFound;
            }
            return isWindowFound;
        }
    });
1
qo'shib qo'ydi

Seleniy 2 dan (org.seleniumhq.selenium: selenyum-java: 2.53.0) selenyum 3 ga o'zgartirilganda bu derleme xatoni oldim (org.seleniumhq.selenium: selenyum-java: 3.4.0).

Yuqorida aytib o'tilganidek, guava 18 (guava: com.google.guava: 18.0) dan guava 21 ga o'tish kerak edi (guava: com.google.guava: 21.0).

Shu bilan birga, qurilgan Java 8-dan foydalanish uchun sozlash kerak edi

ExpectedCondition extends Function
Function extends java.util.function.Function

bu erda java.util.function.Function Java 8 JDK dan kelishi kerak.

Buyruqning satri uchun JAVA_HOME muhit o'zgaruvchisini JAVA_HOMEga o'zgartirdim: C: \ Program Files \ Java \ jdk1.8.0_131

For Eclipse, Windows -> Preferences, Java/Installed JREs, Add Button, JRE home: C:\Program Files\Java\jdk1.8.0_131 and JRE name: jdk1.8.0_131.

1
qo'shib qo'ydi

Agar bog'liqliklaringizni boshqarish uchun maven ishlatilayotgan bo'lsa, qaramlik hiyerarşisini tekshiring va ishlatilayotgan gavadagi versiyani tekshiring. selenli-masofaviy-haydovchi JAR guava versiyasi 21 ni talab qiladi. Kiruvchi bo'lmagan guava versiyasini ishlatadigan artefaktga qo'shib qo'ying. Misol uchun:


io.github.bonigarcia
webdrivermanager
1.5.1
  
    
       com.google.guava
       guava
    
  

1
qo'shib qo'ydi

Mavenni ishlatayotgan bo'lsangiz, bog'liqliklar buyurtma qilish muhimdir .

Misol uchun:

public static void main(String[] args) {
    System.setProperty("webdriver.gecko.driver", "/Users/me/geckodriver");
    final WebDriver driver = new FirefoxDriver();
    driver.get("https://www.google.com");
    final WebDriverWait wait = new WebDriverWait(driver, 5);
    final By feelLuckyXpath = By.xpath("//div[@class='jsb']/center/input[@type='submit' and @name='btnI']");
    wait.until(ExpectedConditions.visibilityOfElementLocated(feelLuckyXpath)).click();
    driver.close();
}

ushbu kod quyidagi maven bog'liqliklar bilan yaxshi ishlaydi:


    org.seleniumhq.selenium
    selenium-java
    3.8.1



    com.google.api-client
    google-api-client
    1.22.0

ammo u tartibga solinganida muvaffaqiyatsiz bo'lishi mumkin:


    com.google.api-client
    google-api-client
    1.22.0



    org.seleniumhq.selenium
    selenium-java
    3.8.1

Bu holatda google-api-client o'z ichiga oladi:

com.google.guava
guava-jdk5

selenyum libidagi guava lib ni soya qiladigan bog'liqlik.

Bunday holatda xato:

no instance(s) of type variable(s) V exist so that ExpectedCondition<> ...

method until in class org.openqa.selenium.support.ui.FluentWait cannot be applied to given types; required: java.util.function.Function found: org.openqa.selenium.support.ui.ExpectedCondition reason: cannot infer type-variable(s) V (argument mismatch; org.openqa.selenium.support.ui.ExpectedCondition cannot be converted to java.util.function.Function)

0
qo'shib qo'ydi

Java.util.function bilan bog'liq muammoga duch kelmoqdaman. Yuqoridagi o'zgarishlarni guava versiyasida 21 marta o'zgartirib, maven plaginini konfiguratsiya versiyasini o'zgartirish maven-kompilyator-plagin 3.11.81.8
Men hali ham bir xil xatolikka duch kelgan edim va qurilish muvaffaqiyatsizlikka uchradi. Buning uchun maven repo .m2 papkasini o'chirish va loyihani boshidan import qilish va keyin quyidagi o'zgarishlarni amalga oshirishga urinib ko'ring. POM selenyum java va selenyum server versiyasida o'zgarishlar kiritilgandan so'ng Maven yangilanishini bajaring va maven toza va keyin maven install.Somehow pom.xml mening holda mening katta selenyum versiyasidan foydalangan. Maven plaginini o'zgartirgandan so'ng, foydalanilgan jdk versiyasini 1,8 ga o'zgartirdim va hozir men uchun juda yaxshi ishlaydi

0
qo'shib qo'ydi