Не удается получить ссылку на элемент с помощью Selenium в Python

#python #selenium #web-scraping #bots #nosuchelementexception

#питон #селен #веб-очистка #боты #исключение nosuchelementexception

Вопрос:

Я пытаюсь щелкнуть по элементу, но, похоже, я не могу получить ссылку из элемента в этом div. У меня такое чувство, что я перепробовала все.

Вот пример HTML-кода:

 <div class="tile css-yrcab6-Tile e1yt6rrx0" data-testid="product-tile">
  <a style="color:black" href="/product-name">...</a> #what I want to click
</div>
 

Вот несколько способов, которыми я пытался щелкнуть:

#1

 item_div = item.find_element_by_tag_name('div')
item_link = item_div.find_element_by_tag_name('a')
#this returns NoElement for element with tag 'a'
 

#2

 item_link = item.find_element_by_css_selector('div.tile a')
#again, returns no element
 

Я хочу щелкнуть по каждому элементу на странице, используя цикл for

Вот код до сих пор:

 def do_items(self):
    for page in range(self.maxPages):
        maincontent = driver.find_element_by_id('main-content')
        browsegrid = maincontent.find_element_by_class_name('browse-grid')
        items_on_page = browsegrid.find_elements_by_tag_name('div')
        for item in items_on_page:
            item_div = item.find_element_by_tag_name('div')
            item_link = item_div.find_element_by_tag_name('a')
            item_link.click()
            time.sleep(5)
            break
        break #breaks for the sake of testing, i only want to click the first item to see it works.
 

Я довольно новичок в selenium, поэтому не совсем понимаю, почему он не может найти нужный элемент. Согласно моему коду, я нахожусь прямо на вершине..

Ответ №1:

 //div[@data-testid='product-tile']/a
 

Простой xpath для использования для щелчка.

Теперь вы либо хотите сделать это, взяв все теги a и используя driver.get(), либо щелкнув по каждому элементу. Если он перейдет на другую страницу, вы будете использовать driver.switch в другое окно, а затем driver.close(). Если этого не произойдет, вы можете просто использовать driver.back(), чтобы повторно захватить элементы, а затем использовать его индекс для щелчка ().

Комментарии:

1. Это сработало, спасибо! Думаю, я немного усложнял ситуацию. Что вы имели в виду, используя «Если он перейдет на другую страницу, вы будете использовать driver.switch в другое окно, а затем driver.close()»? Когда я нажимаю на элемент, он приводит меня на страницу, на которой я должен быть, затем план состоит в том, чтобы получить некоторые данные, вернуться назад, а затем выполнить следующий элемент на странице (продолжить цикл for). В чем разница, используя driver.switchto() вместо этого?

2. Если бы он открылся как новая вкладка, вам пришлось бы сделать это немного по-другому и так далее.