Есть отличная удаленная работа для php+codeception+jenkins+allure+docker спецов. 100% remote! Присоединиться к проекту

Python Selenium click on all <a> in <div>

python
selenium
Теги: #<Tag:0x00007f7b62a106a0> #<Tag:0x00007f7b62a10560>

(Alex Smi) #1

Помогите разобраться.


На этом скрине, по css селектору находит 24 нода. Мне нужно кликнуть на каждый по очереди.

Пытался так:

    li = driver.find_elements_by_css_selector('div.crop-filters.ng-scope .btn')
    for x in range(24, len(li)):
          if li[x].is_displayed():
              li[x].click()

Потом так:

items = driver.find_elements_by_css_selector("crop-filters.ng-scope a.btn")
       for item in items:
         item.click()

В этом примере кликает на все элементы, почти, одновременно
Подскажите решении


(Alex Smi) #2

Решил… может пригодиться новичкам

 li = driver.find_elements_by_css_selector('div.crop-filters.ng-scope .btn')
        li2 = li[1:50]
        for x in range(len(li2)):
            if li2[x].is_displayed():
                ActionChains(driver).move_to_element(li2[x]).click().perform()
                time.sleep(1)

(Maxim Zaitsev) #3

Не дай бог на такое новичкам смотреть! :disappointed_relieved:
По пунктам:

  1. li2 = li[1:50] - что это за срез списка такой? По любому есть варианты составить более подходящий локатор для поиска ссылок
  2. for x in range(len(li2)) - может лучше так?
for el in li2:
    if el.is_displayed():
    ....

3, Использование ActionChains в таких простых ситуациях смысла особого не имеет. А скорость теста и надежность явно будет ниже.
4. time.sleep(1) - за такое расстрел сразу. Но иногда действительно не обойтись.


(Alex Smi) #4

Я сам новичок и глаза у меня не выпали))

И как это должно выглядеть?


(Maxim Zaitsev) #5

Как-то так:

a_list = driver.find_elements_by_css_selector('another_locator')
for a in a_list:
    if a.is_displayed():
        a.click()

(Alex Smi) #6

как-то так не работало. Так и знал что совет будет “как-то так” ))


(ex3me0) #7

Советую ознакомиться с основами питона/итераторов прежде чем писать нечто подобное.
Это даже не смешно, за “нацию” обидно…