Python中selenium的webdriver常见问题与解决方案
我想在 ubuntu server 下面,基于 selenium 的 webdriver 开发没有界面的爬虫,chrome 和 firefox 现在支持无界面 headless,但是在 windows 下面没有问题,在 ubuntu server 下面一直有问题,如下:
File "firefox.py", line 39, in <module> driver = webdriver.Firefox() File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/firefox/webdriver.py", line 154, in init keep_alive=True) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 151, in init self.start_session(desired_capabilities, browser_profile) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 240, in start_session response = self.execute(Command.NEW_SESSION, parameters) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/webdriver.py", line 308, in execute self.error_handler.check_response(response) File "/usr/local/lib/python2.7/dist-packages/selenium/webdriver/remote/errorhandler.py", line 194, in check_response raise exception_class(message, screen, stacktrace) selenium.common.exceptions.WebDriverException: Message: Unable to find a matching set of capabilities
求教下,在 ubuntu server 下面,可行吗?
Python中selenium的webdriver常见问题与解决方案
帖子回复:
Selenium WebDriver 常见问题确实挺烦人的,我整理了几个最常遇到的坑和解决方案:
1. 元素定位不到(NoSuchElementException)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Chrome()
driver.get("https://example.com")
# 错误方式 - 直接定位,页面没加载完就报错
# element = driver.find_element(By.ID, "myElement")
# 正确方式 - 显式等待
wait = WebDriverWait(driver, 10)
element = wait.until(EC.presence_of_element_located((By.ID, "myElement")))
element.click()
2. 元素不可交互(ElementNotInteractableException)
# 先滚动到元素可见位置
from selenium.webdriver.common.action_chains import ActionChains
element = driver.find_element(By.ID, "target")
actions = ActionChains(driver)
actions.move_to_element(element).perform()
# 或者用JS直接点击
driver.execute_script("arguments[0].click();", element)
3. 弹窗/Alert处理
# 等待alert出现并处理
wait.until(EC.alert_is_present())
alert = driver.switch_to.alert
print(alert.text)
alert.accept() # 确认
# alert.dismiss() # 取消
4. 多窗口/iframe切换
# 切换到新窗口
main_window = driver.current_window_handle
new_window = [w for w in driver.window_handles if w != main_window][0]
driver.switch_to.window(new_window)
# 切换回主窗口
driver.switch_to.window(main_window)
# iframe切换
driver.switch_to.frame("frame_name") # 通过name
driver.switch_to.frame(driver.find_element(By.TAG_NAME, "iframe")) # 通过元素
driver.switch_to.default_content() # 切回主文档
5. 下拉选择框(Select)
from selenium.webdriver.support.ui import Select
select = Select(driver.find_element(By.ID, "dropdown"))
select.select_by_visible_text("选项文本")
select.select_by_value("option_value")
select.select_by_index(1) # 索引从0开始
6. 文件上传
# 不要尝试模拟点击文件选择对话框,直接send_keys
upload_input = driver.find_element(By.XPATH, "//input[@type='file']")
upload_input.send_keys("/path/to/your/file.txt")
7. 等待页面加载完成
# 等待整个页面加载
driver.implicitly_wait(10) # 隐式等待(全局设置)
# 等待特定条件
wait.until(EC.title_contains("目标标题"))
wait.until(EC.url_contains("特定路径"))
8. 处理动态加载内容
# 等待AJAX加载完成
wait.until(lambda d: d.execute_script("return jQuery.active == 0"))
# 或者等待元素不再变化
old_element = driver.find_element(By.ID, "dynamic")
wait.until(EC.staleness_of(old_element))
9. 浏览器选项配置
from selenium.webdriver.chrome.options import Options
options = Options()
options.add_argument("--headless") # 无头模式
options.add_argument("--disable-gpu")
options.add_argument("--window-size=1920,1080")
driver = webdriver.Chrome(options=options)
10. Cookies处理
# 获取所有cookies
cookies = driver.get_cookies()
# 添加cookie
driver.add_cookie({"name": "test", "value": "123"})
# 删除所有cookies
driver.delete_all_cookies()
关键建议: 多用显式等待,少用time.sleep(),定位元素优先用ID和CSS选择器。
这些是我实际项目中总结的经验,基本上能覆盖80%的常见问题。具体问题还得具体分析,但掌握这些基本套路能少走很多弯路。
server 也能安装 Firefox ?
话说怎么启动无界面模式呢?
PhantomJs 支持无界面


