Selenium - вход в Facebook заставляет веб-драйвер зависать на неопределенный срок - PullRequest
2 голосов
/ 04 мая 2019

У меня есть простая программа, которая входит в Facebook и получает 3 URL:

def setup_driver():
    prefs = {"profile.default_content_setting_values.notifications": 2}
    chrome_options = webdriver.ChromeOptions()
    chrome_options.add_experimental_option("prefs", prefs)
    chrome_options.add_argument('--headless')
    chrome_options.add_argument('--no-sandbox')
    driver = webdriver.Chrome(executable_path="./chromedriver_linux",
                              chrome_options=chrome_options)
    return driver

def log_into_facebook(driver):
    driver.get("https://www.facebook.com/")
    email_field = driver.find_element_by_id("email")
    email_field.send_keys("<MY EMAIL ADDRESS>")
    password_field = driver.find_element_by_id("pass")
    password_field.send_keys("<MY FB PASSWORD>")
    driver.find_element_by_id("loginbutton").click()

if __name__ == "__main__":

    driver = setup_driver()
    log_into_facebook(driver)
    print("before getting url 1")
    driver.get('https://facebook.com/2172111592857876')
    print("before getting url 2")


 #Stackoverflow is breaking indentation
driver.get('https://www.facebook.com/beaverconfessions/posts/2265225733546461')
    print("before getting url 3")
    driver.get('https://www.facebook.com/beaverconfessions/posts/640487179353666')
    print("finished getting 3 urls")

На моей локальной машине эта программа работает нормально. Однако в моем экземпляре AWS EC2 эта программа делает мой экземпляр непригодным для использования (скрипт Python будет зависать / зависать после того, как на консоль будет выведено «до получения url 2»). Пока сценарий зависает, экземпляр EC2 станет настолько медленным, что другие программы на экземпляре также перестают работать должным образом. Мне нужно принудительно закрыть программу с помощью Ctrl-C, чтобы экземпляр снова начал реагировать.). Однако, если я закомментирую log_into_facebook(driver), то программа будет работать нормально.

Я бы попытался получить трассировку стека, но на самом деле программа не аварийно завершает работу, а просто никогда не достигает «до получения URL-адреса 3».

Это ничего не стоит, ранее я получал ошибки "недопустимый идентификатор сеанса" с программой, которая была похожа на эту (она также вошла в Facebook и затем несколько раз вызывала driver.get).

Обновление : удаление опции --no-sandbox из webdriver, похоже, решило проблему. Я не уверен почему. У меня изначально была эта опция, потому что раньше у меня была ошибка «невозможно исправить открытые страницы», и я прочитал, что «--no-sandbox» исправит ошибку.

1 Ответ

1 голос
/ 05 мая 2019
    chrome_options.add_argument('--no-sandbox')

Роймунсон сообщает, что подходящим способом решения проблемы зависания является:

Не указывайте параметр --no-sandbox в веб-драйвере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...