Есть ли способ для скрипта очистки приостановить, чтобы пользователь мог вручную войти на веб-сайт, а затем возобновить очистку сайта?

#python #selenium #selenium-webdriver #web-scraping

#python #selenium #selenium-webdriver #веб-очистка

Вопрос:

Вот что у меня есть до сих пор:

 from time import sleep
from selenium import webdriver

driver = webdriver.Chrome('/Users/uglyr/chromedriver')  
driver.get('https://www.linkedin.com')

#now the script must pause until I manually login.

...

#after successful login the script must resume taking me from my feed page to my profile page

profile = driver.find_element_by_xpath("//div[@data-control-name='identity_profile_photo']/parent::a")

profile.click()

sleep(4)
# the code to scrape my own profile
  

Я создаю веб-приложение, и я хотел бы предоставить пользователям возможность импортировать свой профиль в веб-приложение после того, как они вошли в свою учетную запись LinkedIn.

После очистки информации профиля я бы отобразил ее для пользователя, чтобы подтвердить и импортировать эту информацию в базу данных приложения. Скорее всего, мне нужно будет запустить webdriver удаленно, но я пересеку этот мост, когда доберусь до него.

Я был бы признателен за любые идеи, которые у вас могут возникнуть.

Ответ №1:

Вы должны использовать wait.until функцию. Подробнее об этом можно прочитать здесь: https://selenium-python.readthedocs.io/waits.html

 from time import sleep
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait 

driver = webdriver.Chrome('C:/chromedriver')  
driver.get('https://www.linkedin.com/login?')

wait = WebDriverWait(driver, 10)

wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="ember227"]')))

profile = driver.find_element_by_xpath('/html/body/div[8]/div[3]/div/div/div/aside[1]/div[1]/div[1]/a')

profile.click()

sleep(4)
  

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

1. спасибо за ответ, я попробовал это, но я получаю исключение тайм-аута примерно через 2 секунды. Драйвер не ждет 10 секунд, поэтому у меня нет времени для входа в систему вручную.

2. странно, я получаю тайм-аут через 10 секунд! Можете ли вы опубликовать свою ошибку здесь? это действительно тайм-аут? Вы пытались увеличить время до истечения времени ожидания?

3. --------------------------------------------------------------------------- TimeoutException Traceback (most recent call last) <ipython-input-5-f6cdad1c81d3> in <module> 10 wait = WebDriverWait(driver, 10) 11 ---> 12 wait.until(EC.visibility_of_element_located((By.XPATH, '//*[@id="ember227"]'))) 13 14 profile = driver.find_element_by_xpath('/html/body/div[8]/div[3]/div/div/div/aside[1]/div[1]/div[1]/a')

4. ~anaconda3libsite-packagesseleniumwebdriversupportwait.py in until(self, method, message) 78 if time.time() > end_time: 79 break ---> 80 raise TimeoutException(message, screen, stacktrace) 81 82 def until_not(self, method, message=''): TimeoutException: Message: это сообщение об ошибке, которое я получаю

5. вы пытались увеличить значение с 10 до, может 30 быть?

Ответ №2:

Вы могли бы дождаться своего собственного отзыва с подсказкой, подобной этой:

 from time import sleep
from selenium import webdriver
driver = webdriver.Chrome('/Users/uglyr/chromedriver')
driver.get('https://www.linkedin.com')

#now the script must pause until I manually login.
while True:
    # print("Did you login yet?")
    answer = input("Did you login yet?")
    if answer == 'Yes':
        break
...

#after successful login the script must resume taking me from my feed page to my profile page

profile = driver.find_element_by_xpath("//div[@data-control-name='identity_profile_photo']/parent::a")

profile.click()

sleep(4)
# the code to scrape my own profile