«Кнопка сообщения» в Linkedin выглядит следующим образом:
<button class="message-anywhere-button mn-connection-card__message-btn button-secondary-medium" aria-label="Send message to John Smith" data-ember-action="" data-ember-action-5128="5128">
<span aria-hidden="true">Message</span>
<span class="visually-hidden">
Send a message to John Smith
</span>
</button>
Так что для локатора у вас есть несколько вариантов, давайте остановимся на наиболее примитивном: ищите Send message to
текст внутри aria-label
:
xpath = '//button[contains(@aria-label,"Send message to")]'
Этот локатор найдет все кнопки. Но в зависимости от того, какую функцию вы вызываете, вы можете выбрать только первый элемент или все элементы. Допустим, цель состоит в том, чтобы собрать все кнопки:
xpath = '//button[contains(@aria-label,"Send message to")]'
all_message_buttons = driver.find_elements(By.XPATH, xpath)
for message_button in all_message_buttons:
print("Can %s" % message_button.get_attribute("aria-label"))
# prints Can Send Message to John Smith
# and any other names available on page
Наконец, перед выбором кнопок необходимо убедиться, что страница загружена и кнопки действительно отображаются. Есть разные способы сделать это, но я обычно просто заменяю нужные мне элементы на ожидание их:
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
# ...
xpath = '//button[contains(@aria-label,"Send message to")]'
wait = WebDriverWait(browser, 10) # wait for up to 10 sec
all_message_buttons = wait.until(EC.presence_of_element_located((By.XPATH, xpath)))
for message_button in all_message_buttons:
print("Can %s" % message_button.get_attribute("aria-label"))
# prints Can Send Message to John Smith
# and any other names available on page