Python 使用无头chrome webdriver时出现超时异常错误

Python 使用无头chrome webdriver时出现超时异常错误,python,selenium,google-chrome,selenium-webdriver,Python,Selenium,Google Chrome,Selenium Webdriver,我的selenium代码在没有headless模式的情况下工作,但当我尝试使用headless模式时,它会引发TimeOutException错误。我正在使用python selenium chrome webdriver。我正在我的本地机器上测试这个 我正在尝试使用selenium登录Instagram,但它在无头模式下无法工作。我试图调整窗口的大小(最大化,手动设置大小,将_调整为),但都不起作用 chrome_options = Options() chrome_options.add_a

我的selenium代码在没有headless模式的情况下工作,但当我尝试使用headless模式时,它会引发TimeOutException错误。我正在使用python selenium chrome webdriver。我正在我的本地机器上测试这个 我正在尝试使用selenium登录Instagram,但它在无头模式下无法工作。我试图调整窗口的大小(最大化,手动设置大小,将_调整为),但都不起作用

chrome_options = Options()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--no-sandbox')
chrome_options.add_argument("—disable-gpu")
chrome_options.add_argument('--disable-dev-shm-usage')
chrome_driver = "C:\Program Files (x86)\chromedriver.exe"
driver = webdriver.Chrome(chrome_driver,chrome_options=chrome_options)
driver.set_window_size(1382, 744)
我正在使用下面的helper函数来等待元素

def waiting(xpath):
    element = WebDriverWait(driver, 20).until(
        EC.presence_of_element_located((By.XPATH, xpath))
    )
    return element
我登录Instagram的代码如下:

driver.get("https://www.instagram.com")
username = waiting("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[1]/div/label/input")
username.send_keys("abcdeff")
password = waiting("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[2]/div/label/input")
password.send_keys("password")
driver.find_element_by_xpath("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[3]/button").click()
我得到这个错误:

Traceback (most recent call last):
  File "C:\Users\madhav\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 2070, in wsgi_app
    response = self.full_dispatch_request()
  File "C:\Users\madhav\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 1515, in full_dispatch_request
    rv = self.handle_user_exception(e)
  File "C:\Users\madhav\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 1513, in full_dispatch_request
    rv = self.dispatch_request()
  File "C:\Users\madhav\AppData\Local\Programs\Python\Python39\lib\site-packages\flask\app.py", line 1499, in dispatch_request
    return self.ensure_sync(self.view_functions[rule.endpoint])(**req.view_args)
  File "C:\Users\madhav\Desktop\Fprojects\insta-sam\temp.py", line 47, in login
    username = waiting("/html/body/div[1]/section/main/article/div[2]/div[1]/div/form/div/div[1]/div/label/input")
  File "C:\Users\madhav\Desktop\Fprojects\insta-sam\temp.py", line 30, in waiting
    element = WebDriverWait(driver, 20).until(
  File "C:\Users\madhav\AppData\Local\Programs\Python\Python39\lib\site-packages\selenium\webdriver\support\wait.py", line 80, in until
    raise TimeoutException(message, screen, stacktrace)
selenium.common.exceptions.TimeoutException: Message:

您在步骤
username
中遇到错误。我通常不喜欢使用“WebDriverWait()…直到(…)”。我总是使用:

import time
...
...
time.sleep(10)
...
...
这总能解决我的问题,而且效率也很高!
正如Swaroop所提到的,您应该尽可能避免使用完整的
xpath
!代码可能会崩溃。

我已经尝试了下面的代码,它对我有效。请尝试一下,如果它解决了您的问题,请将其标记为答案。记住在代码中更改您的用户名您的密码

from selenium import webdriver
from selenium.webdriver import ActionChains
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument(
    "user-agent=Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.88 Safari/537.36")

driver = webdriver.Chrome(options=options)
wait = WebDriverWait(driver, 30)
action = ActionChains(driver)

driver.get("https://www.instagram.com/")

wait.until(EC.presence_of_element_located((By.NAME, "username"))).send_keys("yourUserName")
wait.until(EC.presence_of_element_located((By.NAME, "password"))).send_keys("YourPassword")
wait.until(EC.presence_of_element_located((By.XPATH, "//div[text()='Log In']/parent::button"))).click()

print(driver.current_url)
注意-Instagram检测到您正在无头模式下使用selenium。为了避免这种情况,您可以使用伪useragent,如
选项。添加参数(“user agent=Mozilla/5.0(Windows NT 10.0;Win64;x64)AppleWebKit/537.36(KHTML,如Gecko)Chrome/87.0.4280.88 Safari/537.36”)


希望它能解决你的问题。谢谢

首先,不要在脚本中使用绝对路径,这样会导致崩溃。使用“id”或您可以编写“xpath”来选择标记。我没有检查,但很可能您的代码由于绝对路径而中断。我正在等待帮助器函数中传递元素的xpath,但仍然给出错误。我发现使用标记名找不到元素。使用这些等待后,感谢仍然不起作用。我认为页面在无标题模式下是白色空白的,因为页面上连一个元素都没有。非常感谢您为我工作了这么多,Instagram检测到了机器人。点击登录按钮后,它向我抛出了错误,所以我用selenium拍摄了屏幕截图,发现Instagram说“我们检测到一个不寻常的登录尝试,发送安全代码”,我如何才能确保instagram中的我是真正的用户,只是尝试使用bot登录并绕过安全检查?谢谢