Как найти несколько элементов в индексе div с помощью Selenium

Итак, в настоящее время я пытаюсь найти все ссылки src среди списка сгенерированных div. Проблема в том, что он использует то же имя класса и тег alt, что и другие элементы на странице, поэтому я застрял с использованием xpath. Но когда я пытаюсь его использовать, я ограничиваюсь возвратом только значения, индексированного в xpath. Например, div [3]. Как я могу найти все элементы div [1-inf], а не только один конкретный? Я обнаружил position () в качестве параметра, но мне не удалось заставить его работать. Может я просто не правильно использую. driver.find_elements_by_xpath("//*[@id='tab-history-flow']/div[3]/a/img").get_attribute('src')

<div style="display:inline-block">
    <a target="_blank" title="Inventory Profile" href="http://csgo.exchange/profiles/76561197969720703">
    <img class="Avatar" alt="avatar" title="ArieBier | 2015-09-16 18:20:58" style="width:32px;height:32px" src="https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/df/dfd267c19d759f730e1051ae4657d0100a6b6c0d.jpg">
    </a>                                    
</div>
<div style="display:inline-block">
<a target="_blank" title="Inventory Profile" href="http://csgo.exchange/profiles/76561198136313290">
<img class="Avatar" alt="avatar" title="by | 2015-09-17 02:53:25" style="width:32px;height:32px" src="https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/5d/5d4c06db9ba89f8a945108af10075ebd348cd1ae.jpg">
</a>                                    
</div>
<div style="display:inline-block">
    <a target="_blank" title="Inventory Profile" href="http://csgo.exchange/profiles/76561198152970370">
    <img class="Avatar" alt="avatar" title="Marn | 2015-10-05 14:40:37" style="width:32px;height:32px" src="https://steamcdn-a.akamaihd.net/steamcommunity/public/images/avatars/ae/ae7878915405c9ad622c9d7fc3b52f3b71ed140a.jpg">
    </a>                                    
</div>

Что я уже пробовал.

driver.find_elements_by_xpath("//*[@id='tab-history-flow']/div/a/img"[position() < 1000]).get_attribute('src')
driver.find_elements_by_xpath("//*[@id='tab-history-flow']/div[position() < 1000]/a/img").get_attribute('src')

person CodeOrDie    schedule 17.03.2019    source источник
comment
Вместо всей прозы опубликуйте минимальный воспроизводимый пример, включая HTML.   -  person kjhughes    schedule 17.03.2019
comment
Возможный дубликат Как перебирать элементы в Selenium и Python?   -  person Sers    schedule 17.03.2019
comment
Добавлен файл html. Это довольно простой вопрос. Я просто пытаюсь понять, как я могу выбрать все эти div за один раз с помощью xpath.   -  person CodeOrDie    schedule 17.03.2019
comment
Я считаю, что нам было бы легче помочь вам, если бы вы разместили код, который уже пробовали, даже если он не работает. Отладка кода, который мы видим, более эффективна, чем попытки преобразовать ваше объяснение в код и отладить его.   -  person Niayesh Isky    schedule 17.03.2019
comment
Хорошо. Я добавил оба выражения, которые пробовал. Ни один из них ничего не вернул, когда я попытался их запустить.   -  person CodeOrDie    schedule 17.03.2019


Ответы (2)


Чтобы распечатать все src атрибуты, вы можете использовать любой из следующих Стратегии поиска:

  • Использование CSS_SELECTOR:

    print([element.get_attribute('src') for element in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "#tab-history-flow a[title='Inventory Profile']>img.Avatar[alt='avatar']")))])
    
  • Использование XPATH:

    print([element.get_attribute('src') for element in WebDriverWait(driver, 10).until(EC.visibility_of_all_elements_located((By.XPATH, "//*[@id='tab-history-flow']//a[@title='Inventory Profile']/img[@class='Avatar' and @alt='avatar']")))])
    
  • Примечание. Вам необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
person DebanjanB    schedule 17.03.2019
comment
Спасибо. Это прекрасно работает. Но у меня есть одна довольно большая проблема. Я пытаюсь пролистать все эти страницы инвентаря и зафиксировать любые предметы, в истории которых есть определенные люди. Хотя я действительно хотел, чтобы он просканировал все файлы srcs. Что мне действительно нужно, так это возвращать src только от людей, которые соответствуют этому элементу. Но так, как я его настроил сейчас, он возвращает каждый аватар из любого из элементов, профиль которых совпадал в истории. И не только те несколько человек, которых я ищу. Вид сбивает с толку. - person CodeOrDie; 18.03.2019
comment
@CodeOrDie Сам по себе не должен быть таким сложным, но вы должны задать новый вопрос в соответствии с вашим новым требованием, чтобы участники могли вам помочь. - person DebanjanB; 18.03.2019

Ну, я не вижу никаких элементов с идентификатором, тем более, что вы указали, поэтому я точно не знаю, почему он не работает. Однако я думаю, что это можно сделать довольно легко. Я заметил, что все теги img в HTML-коде, который вы вставили в свой вопрос, имеют class="Avatar". Вот как я получу источники изображений:

images = driver.get_elements_by_css_selector('#tab-history-flow > div > a > img')
for image in images:
    image = image.get_attribute(src)

Это должно превратить images в массив, содержащий все ваши источники изображений. Сообщите мне, если это поможет / не поможет.

Отказ от ответственности: я не видел всю вашу HTML-страницу, поэтому используемый мной селектор может не работать. теперь у меня есть, и я думаю, что этот код должен работать на вас.

person C. Peck    schedule 17.03.2019
comment
Да, извините, идентификатор, который я указал, является контейнерным div, в котором лежат все эти div. Проблема, с которой я столкнулся, заключалась в том, что на странице также есть несколько других изображений с тем же классом и alt для Avatar. Который также будет возвращен, но я попробую и посмотрю, смогу ли я это понять. - person CodeOrDie; 17.03.2019
comment
Я думал, вам нужны все источники изображений на странице? - person C. Peck; 17.03.2019
comment
csgo.exchange/item/15534755273 Большинство из них. Все под историей потока. Но двое в верхнем левом углу также являются аватарами. - person CodeOrDie; 17.03.2019
comment
Я думаю, что лучше всего будет искать imgs с классом Avatar со стилем width: 32px; height: 32px. Не уверен на 100%, как это будет выглядеть. - person CodeOrDie; 17.03.2019
comment
Что вы имеете в виду под «Все те, которые находятся под историей потока»? - person C. Peck; 17.03.2019
comment
Все маленькие изображения под историей внизу страницы. - person CodeOrDie; 17.03.2019
comment
pics = driver.find_elements_by_css_selector("[style^=width]") Мне повезло с этим. Но он не позволяет мне добавить к нему 32 пикселя. При попытке ничего не возвращает. - person CodeOrDie; 17.03.2019
comment
Попробуйте указанный выше селектор CSS ('# tab-history-flow ›div› a ›img'). Я думаю, что вы получите все изображения, которые вам нужны. - person C. Peck; 17.03.2019
comment
Хм. Похоже, это сработает. Но когда я добавляю оператор for и пытаюсь распечатать результат, я ничего не получаю. - person CodeOrDie; 17.03.2019
comment
Если вы хотите распечатать результат, попробуйте добавить в цикл «print (str (image))». - person C. Peck; 17.03.2019