Как найти этот элемент?

Я хочу найти кнопку «ДАЛЕЕ». Поиск по имени класса не работает, потому что есть другой элемент с тем же именем класса. У этой кнопки нет идентификатора.

Я попытался найти по xpath >> содержит текст и т. Д., И он работает. Но это не идеальный способ, из-за возможного будущего перевода сайта и текст «СЛЕДУЮЩИЙ» может показаться совсем другим ... Речь идет о двух последних строчках.

https://imgur.com/a/N6RK4Hh

from time import sleep

import self as self
from selenium import webdriver
from selenium.common.exceptions import ElementClickInterceptedException, StaleElementReferenceException
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.keys import Keys

driver = webdriver.Chrome(executable_path="C:\Chromedriver\chromedriver.exe")
driver.implicitly_wait(1)
driver.get("https://cct-103.firebaseapp.com/")

try:
    checkin = WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.CLASS_NAME, "MuiButton-label")))
    checkin.click()
except StaleElementReferenceException:
    checkin = WebDriverWait(driver, 1).until(EC.element_to_be_clickable((By.CLASS_NAME, "MuiButton-label")))
    checkin.click()

locator = (By.ID, "guestName")
guest_input = driver.find_element(*locator)
guest_input.send_keys("xyz")

 next_button = driver.find_element_by_xpath("//*[contains(text(), 'NEXT')]")     
 next_button.click()

person Virtual107    schedule 13.09.2019    source источник
comment
imgur.com/a/N6RK4Hh   -  person Virtual107    schedule 13.09.2019
comment
Предоставьте минимальный воспроизводимый пример   -  person Pitto    schedule 13.09.2019


Ответы (2)


Используйте WebDriverWait и element_to_be_clickable и следующую опцию локатора.

next_button =  WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(., 'NEXT')]")))
next_button.click()

Иногда вы можете получить перехваченное исключение.

 next_button =  WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.XPATH,"//button[contains(., 'NEXT')]")))
 driver.execute_script("arguments[0].click();", next_button)

Обновлен код с помощью селектора CSS.

next_button =  WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"button.MuiButtonBase-root")))
next_button.click()

Or

next_button =  WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.CSS_SELECTOR,"button.MuiButtonBase-root")))
driver.execute_script("arguments[0].click();", next_button)
person KunduK    schedule 13.09.2019
comment
Checkin и guest_input работают правильно. Проблема с кнопкой ДАЛЕЕ. Я не хочу находить его по тексту, который содержит эта кнопка, потому что этот сайт в будущем можно будет перевести. И следующий текст изменится на немецкую (или другую языковую) версию этого слова. Как найти эту кнопку NEXT? - person Virtual107; 13.09.2019
comment
@ Virtual107: попробуйте обновленный селектор CSS и дайте мне знать. - person KunduK; 13.09.2019
comment
Вы правы, я мог найти его с помощью CSS Selector. Могу я использовать простой Next_button.click () вместо driver.execute ...... В чем собственно разница? - person Virtual107; 13.09.2019
comment
Да, вы можете сделать простой щелчок, о котором я упоминал. Однако иногда вы можете получить перехваченное исключение, если вы его получите, вы можете использовать опцию driver.execute. - person KunduK; 13.09.2019

Чтобы найти и click() на элементе с текстом как NEXT, вы должны вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать любое из следующих Стратегии локатора:

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

    driver.get("https://cct-103.firebaseapp.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "span.MuiButton-label"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "input#guestName[name='guestName']"))).send_keys("Virtual107")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button.MuiButtonBase-root.MuiButton-root.MuiButton-contained>span.MuiButton-label"))).click()
    
  • Использование XPATH:

    driver.get("https://cct-103.firebaseapp.com/")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='MuiButton-label']"))).click()
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='MuiButton-label']"))).send_keys("Virtual107")
    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//span[@class='MuiButton-label' and text()='NEXT']"))).click()
    
  • Примечание. Вам необходимо добавить следующий импорт:

    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 13.09.2019