Создание массива с добавлением фильтра класса

java
webdriver
Теги: #<Tag:0x00007f7b68d06610> #<Tag:0x00007f7b68d06458>

(stek) #1

Всем привет. Подскажите пожалуйста, на странице есть радиобатонны, некоторые из них имеют дополнительно клас .hidden.Как мне отфильтровать радиобатонный с класом .hidden и потом уже добавить все нужные элементы в масив?

 public String[] shopItems()
 {
        String[] newItem = new String[7];

 String elements= String.valueOf(($(".group.shops > div > div > div")
            .shouldNotBe(cssClass(".hidden"))));

  for (int i = 0; i <newItem.length; i++) {
            {
                newItem[i] = elements + ":nth-child(" + (i + 1) + ")";
            }
            System.out.println(newItem);
       }
        return newItem;


(Дмитрий Еремин) #2

так, а $(“input.hidden”) селектор не помог?


(stek) #3

[Utils] [ERROR] [Error] java.lang.IllegalStateException: No webdriver is bound to current thread: 1. You need to call open(url) first.

на эту строку error .shouldNotBe(cssClass(".hidden"))));


(Ugin Berets) #4

Можно HTML глянуть?


(Дмитрий Еремин) #5

ну…
выглядит так, будто нужно сначала открыть страницу в браузере

call open(url) first.
Покажите весь код теста, пожалуйста


(Vatslau) #6

какие for ± ? не рвите сердце
селениде - фильтры

 private ElementsCollection
          availableProductsList = $$(byXpath("какой-то х-пас"));

  public FragmentModalAccociation addAssociation(String searchText) {
    //Be sure that search words are proper
    availableProductsList.filter(text(searchText)).get(0).doubleClick();
    return this;
  }
  
  public FeaturedAppsWidget checkQtyInSlider(int qty) {
    promotionsListSlider
            .filter(Condition.attribute("role", "option"))
            .shouldHaveSize(qty);
    return this;
  }

  private final static SelenideElement
          activeBannerBtn = activeBannerProps.filter(attribute("class", "st-button st-button--primary")).first();

hidden - обычный атрибут как и все другие


(stek) #7

(Ugin Berets) #8

Если надо просто получить список элементов, у которых нет класса hidden, то можно попробовать так:

public ElementsCollection notHiddenElements = $$x("//*[contains(@class,'hidden_shops')]/following-sibling::div[not(contains(@class,'hidden'))]");

Но, может быть, я вас не правильно понял…


(stek) #9

Ну да, мне нужно получить список элементов у которых нет класа hidden, а далее передаю их в Data Provider и кликаю.

org.openqa.selenium.InvalidSelectorException: invalid selector: An invalid or illegal selector was specified
  (Session info: chrome=71.0.3578.98)
  (Driver info: chromedriver=72.0.3626.7 (efcef9a3ecda02b2132af215116a03852d08b9cb),platform=Windows NT 6.1.7601 SP1 x86_64) (WARNING: The server did not provide any stacktrace information)
Command duration or timeout: 0 milliseconds
For documentation on this error, please visit: http://seleniumhq.org/exceptions/invalid_selector_exception.html
Build info: version: '3.14.0', revision: 'aacccce0', time: '2018-08-02T20:19:58.91Z'
System info: host: 'QWQE-IK123', ip: '179.255.23.187', os.name: 'Windows 7', os.arch: 'amd64', os.version: '6.1', java.version: '1.8.0_181'
Driver info: org.openqa.selenium.chrome.ChromeDriver
Capabilities {acceptInsecureCerts: false, acceptSslCerts: false, applicationCacheEnabled: false, browserConnectionEnabled: false, browserName: chrome, chrome: {chromedriverVersion: 72.0.3626.7 (efcef9a3ecda02..., userDataDir: C:\Users\AppData\L...}, cssSelectorsEnabled: true, databaseEnabled: false, goog:chromeOptions: {debuggerAddress: localhost:2243}, handlesAlerts: true, hasTouchScreen: false, javascriptEnabled: true, locationContextEnabled: true, mobileEmulationEnabled: false, nativeEvents: true, networkConnectionEnabled: false, pageLoadStrategy: normal, platform: XP, platformName: XP, proxy: Proxy(), rotatable: false, setWindowRect: true, takesHeapSnapshot: true, takesScreenshot: true, timeouts: {implicit: 0, pageLoad: 300000, script: 30000}, unexpectedAlertBehaviour: ignore, unhandledPromptBehavior: ignore, version: 71.0.3578.98, webStorageEnabled: true}
Session ID: 7602742444fd5c52660d230ff4565d04
*** Element info: {Using=css selector, value=[java.lang.IllegalStateException: No webdriver is bound to current thread: 1. You need to call open(url) first.]:nth-child(1)}

	at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)
	at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)
	at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)
	at java.lang.reflect.Constructor.newInstance(Constructor.java:423)

Браузер открывается, переходит на сайт,а далее кликает только на 1 элемент , и вот ошибка


(Ugin Berets) #10

Проверьте что у вас в переменной “elements”. Там что-то не так )
И опишите более детально кейс, который вы хотите автоматизировать. Какой набор данных должен возвращать дата провайдер?


(Hikari Senshi) #11

Чтобы получить элементы вам нужно использовать следующий вызов:

$$("вашЭлемент").filter(not(cssClass("hiden")));

Если вы хотите нажать на все элементы, то сделайте так


//дополнительно написал проверку на то, что есть минимум 2 таких элемента      $$("вашЭлемент").filter(not(cssClass("hiden"))).shouldHave(CollectionCondition.sizeGreaterThan(1)).forEach(
                (element)->{
                    element.shouldBe(visible).click();
                }
        );

Все зависит от конкретной задачи.)