Задать вопрос
@el-bekasto

Почему Selenium не находит кнопку?

Когда делается реквест на ссылку-приглашение дискорда, и оказывается что ссылка уже устаревшая, selenium исправно находит кнопку "Перейти в Discord":
button = driver.find_element_by_css_selector("[type='button']")

Но когда такая ссылка актуальна, то не может найти кнопку "Принят приглашение". При этом они выглядят вот так:
<button type="button" class="marginTop40-i-78cZ button-3k0cO7 button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeLarge-1vSeWK fullWidth-1orjjo grow-q77ONN"><div class="contents-18-Yxp">Accept Invite</div></button>

<button type="button" class="marginTop40-i-78cZ button-3k0cO7 button-38aScr lookFilled-1Gx00P colorBrand-3pXr91 sizeLarge-1vSeWK fullWidth-1orjjo grow-q77ONN"><div class="contents-18-Yxp">Continue to Discord</div></button>

Коды для "Принять приглашение" и "Перейти в Discord" соответственно. Почему не находит первую кнопку, если их коды почти идентичны? Можно ли каким-то другим способом обнаружить эту кнопку в selenium?
  • Вопрос задан
  • 777 просмотров
Подписаться 1 Простой 13 комментариев
Решения вопроса 1
стандартный подход поиска по таксту кнопки - xpath (есть и альтернативы напр. у протрактор)
text = 'Continue to Discord'
text = 'Принять приглашение'
driver.find_element_by_xpath('//button/div[contains(text(), "{}")]'.format(text))

но если не настроена кодировка может не найти
{"method":"xpath","selector":"//button/div[contains(text(), "Принять приглашение")]"}

и тогда пишется кастомное ожидание при помощи киртранслит
from cyrtranslit import to_latin
from selenium import webdriver
from selenium.webdriver.firefox.webdriver import WebDriver
def waittest:
  def __init__(self, selector, value):
    self.selector = selector
    self.value = value
  def __call__(self, driver):
    element = driver.find_element_by_css_selector(self.selector)
    text = element.text
    print('checking text: "{}" against "{}"'.format(to_latin(text, 'ru'), self.value))
    if to_latin(text, 'ru') == self.value:
      return element
    else:
      return None

text = to_latin('Принять приглашение', 'ru')  
element = WebDriverWait(driver, 10).until( waittest("button[class *= 'button']", text))
Ответ написан
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы