Не удается найти элемент в XPath с драйвером Selenium - PullRequest
0 голосов
/ 18 февраля 2020

Каждый раз, когда я загружаю python скрипт, Xpath для кнопки входа в Facebook и всплывающих кнопок должен изменяться вручную каждый раз перед входом в систему. Как мне изменить это, чтобы мне не нужно было вводить XPath вручную?

from selenium import webdriver
from time import sleep

class TinderBot():
    def __init__(self):
        self.driver = webdriver.Chrome()

    def login(self):
        self.driver.get('https://tinder.com')

        sleep(3)

        #fbxpath = //button[@type = 'button' and @aria-label = 'Log in with Facebook']

        fb_btn = self.driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div/main/div/div[2]/div[2]/div/div/span/div[2]/button')
        fb_btn.click()

        base_window = self.driver.window_handles[0]
        self.driver.switch_to_window(self.driver.window_handles[1])
        fbemail = self.driver.find_element_by_xpath('//*[@id="email"]')
        fbemail.send_keys('ara_98425@yahoo.com')

        fbpass = self.driver.find_element_by_xpath('//*[@id="pass"]')
        fbpass.send_keys('BlackToast5')

        login_btn = self.driver.find_element_by_xpath('//*[@id="u_0_0"]')
        login_btn.click()

        self.driver.switch_to_window(base_window)

        popup1 = self.driver.find_element_by_xpath('//*[@id="modal-manager"]/div/div/div/div/div[3]/button[1]')
        popup1.click()

        popup2 = self.driver.find_element_by_xpath('//*[@id="modal-manager"]/div/div/div/div/div[3]/button[1]')
        popup2.click()

bot = TinderBot()
bot.login()

Это ошибка, которую я получаю:

File "tind_bt.py", line 16, in login
    fb_btn = self.driver.find_element_by_xpath('//*[@id="content"]/div/div[1]/div/div/main/div/div[2]/div[2]/div/div/span/div[2]/button')
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\ProgramData\Anaconda3\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="content"]/div/div[1]/div/div/main/div/div[2]/div[2]/div/div/span/div[2]/button"}
  (Session info: chrome=80.0.3987.106)

Ответы [ 2 ]

1 голос
/ 18 февраля 2020

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

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

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "button[type = 'button'][aria-label = 'Log in with Facebook'] span"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//button[@type = 'button' and @aria-label = 'Log in with Facebook']//span"))).click()
    
  • Примечание : необходимо добавить следующий импорт:

    from selenium.webdriver.support.ui import WebDriverWait
    from selenium.webdriver.common.by import By
    from selenium.webdriver.support import expected_conditions as EC
    
  • Снимок браузера:

tinder_facebook_login


Ссылка

Подробное обсуждение можно найти в:

0 голосов
/ 18 февраля 2020

Может быть, вы сможете реализовать WebDriverWait и посмотреть, решит ли это проблему.

Это может помочь вам начать работу - Selenium WebDriver ожидает отображения элемента

Вот документация Python для явного ожидания - https://selenium-python.readthedocs.io/waits.html

...