Та же кнопка, другой текст. selenium python

#python #python-2.7 #selenium #selenium-webdriver #selenium-chromedriver

#python #python-2.7 #selenium #selenium-webdriver #selenium-chromedriver

Вопрос:

У меня есть два типа кнопок с одинаковыми классами, идентификаторами и т.д., Но две вещи отличаются. Действие, которое они выполняют, и текст. На одной есть текст «пригласить», на другой — «сообщение». Я хочу что-то сделать, когда это «пригласить», и что-то еще, когда это «сообщение». Вы знаете, что я должен использовать? Если? Или я должен использовать webDriverWait ?

Это HTML-код.

 <button aria-label="Invite" class="button m5"> Invite </button>
  

или

 <button aria-label="Message" class="button m5"> Message </button>
  

Я пробовал что-то подобное и не работает. У вас есть идея, почему?

 buttons=driver.find_elements_by_class_name("button m5")
for but in (buttons):
fetch_text=but.text
if "Invite" in fetch_text:
###do somethin
else: ###do somethin
  

Ответ №1:

Поскольку имя класса одинаково для обоих элементов, вы можете сначала извлечь текст, используя className, а затем поместить условие if в текст и затем действовать соответствующим образом.

Например, в вашем случае это было бы похоже:

 fetch_element_text = driver.find_element_by_class_name("button m5").text

if "Invite" in fetch_element_text:
     # Operate according to the Invite button 

elif "Message" in fetch_element_text:
     # Operate according to the Message button
  

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

 buttons=driver.find_elements_by_xpath("//button[@class='button m5']")
print(len(buttons))
for button in buttons:
    fetch_element_text = button.text
  

И теперь вы можете задать то же условие if else, что и упомянутое выше.

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

1. Спасибо!! Работает отлично!!

2. Вы можете еще раз проверить мой код? Я обновил его и для этого контекста, и не работает.. Есть идея, почему?

3. Что за ошибку вы получаете? И есть ли какая-либо причина, по которой вы используете цикл для получения текста?

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

5. Я использую цикл, потому что у меня есть список кнопок. Прямо сейчас я запускаю код и жду, чтобы получить сообщение об ошибке, когда он найдет кнопку «пригласить».

Ответ №2:

Вы могли бы найти каждую кнопку через xpath:

 invite = driver.find_element_by_xpath("//button[@aria-label='Invite']")
print(invite.text)   # Invite
message = driver.find_element_by_xpath("//button[@aria-label='Message']")
print(message.text)  # Message
  

Ответ №3:

Вы не можете использовать find_elements_by_class_name для поиска по нескольким элементам.Пожалуйста, используйте либо xpath , либо CssSelector

 buttons=driver.find_elements_by_xpath("//button[@class='button m5']")
print(len(buttons))
for button in buttons:
    fetch_text = button.text
    if "Invite" in fetch_text:
      print("Invite Button")
    else:
      print("Massage Button")
  

или

 buttons = driver.find_elements_by_css_selector("button.m5")
print(len(buttons))
for button in buttons:
   fetch_text = button.text
   if "Invite" in fetch_text:
      print("Invite Button")
   else:
      print("Massage Button")