1、安装 selenium
在终端上安装
pip install selenium
2、导包
from selenium import webdriver
3、 连接已打开的网页
注意:手动启动Chrome浏览器并指定一个调试端口
3.1 打开调试端口
Windows:
-
首先,找到你的Chrome的安装路径。通常情况下,它可能在以下路径:
C:\Program Files (x86)\Google\Chrome\Application\chrome.exe
或者:
C:\Program Files\Google\Chrome\Application\chrome.exe
2. 打开一个命令提示符窗口。这可以通过按下 Windows + R
键,输入 cmd
并点击确定
来完成。
3. 在命令提示符窗口中,键入以下命令(请确保更改路径为你的Chrome安装路径):
"C:\Program Files (x86)\Google\Chrome\Application\chrome.exe" --remote-debugging-port=9222
然后按Enter键。
这将会启动一个新的Chrome实例,并监听9222端口进行远程调试。
macOS:
1.打开一个终端窗口。
2.输入以下命令并按Enter键
/Applications/Google\ Chrome.app/Contents/MacOS/Google\ Chrome --remote-debugging-port=9222
3.这将同样启动一个新的Chrome实例,监听9222端口进行远程调试。
这将同样启动一个新的Chrome实例,监听9222端口进行远程调试。
注:可以在地址栏输入:chrome://version/ 判断是否打开调试端口
3.2示例:
- 你的ChromeDriver版本与Chrome浏览器版本兼容。
webdriver.Chrome
的路径是正确的(如果它不在你的PATH中)。- 百度已经打开在浏览器的当前选项卡中。
以下是一个简单的连接已打开的网页示例:
对已打开的百度网页进行搜索 ‘狗’的操作
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
# 连接到已打开的Chrome浏览器实例
chrome_options = webdriver.ChromeOptions()
chrome_options.add_experimental_option("debuggerAddress", "127.0.0.1:9222")
driver = webdriver.Chrome(options=chrome_options)
# 假设你已经打开了百度,这里直接查找搜索框并输入"狗"
search_box = driver.find_element(By.ID, "kw")
search_box.send_keys("狗")
search_box.send_keys(Keys.RETURN)
# 注意: 在完成所有操作后,你可能会想关闭driver连接,但不关闭浏览器
# driver.quit()
4、 打开网页进行操作
简单示例:
import time
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
from selenium.webdriver.common.by import By
# 创建一个新的Chrome浏览器窗口
driver = webdriver.Chrome()
# 导航到baidu
driver.get("https://www.baidu.com")
# 找到搜索框元素并输入“狗”
search_box = driver.find_element(By.NAME, "wd")
search_box.send_keys("狗")
search_box.send_keys(Keys.RETURN)
# 等待页面加载完成
# driver.implicitly_wait(10)
# 等待十秒
time.sleep(10)
# 关闭浏览器窗口
driver.quit()
5、常见定位不到问题
selenium.common.exceptions.NoSuchElementException
- 页面尚未完全加载该元素。
- 给定的XPath是错误的或过于特定,不能匹配任何元素。
- 页面的结构已经改变,因此给定的XPath不再有效。
解决方案:
1. 增加等待
确保在查找元素之前,页面已经完全加载了该元素。为此,你可以使用Selenium的显式等待功能:
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver.get('your_webpage_url')
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.XPATH, '/html/body/div[2]/table[1]/tbody/tr/td[3]/font'))
)
except:
print("无法找到指定的元素")
上述代码将等待最多10秒,直到找到指定的元素为止。
2. 重新检查XPath
确认你的XPath是正确的。使用浏览器的开发者工具来测试和验证XPath。要记住,过于具体的XPath可能会在页面结构稍有变化时立即失效。尝试使用更一般的、但仍然能定位到目标元素的XPath。
3. 使用其他定位策略
如果可能的话,考虑使用其他定位策略,如ID、class、CSS选择器等。XPath是强大的,但也可能很脆弱,尤其是当它很具体时。
4. 确保元素确实存在
确保你正在尝试访问的元素确实存在于页面上。也许你访问的是一个不同的版本或页面状态,导致元素不存在。
5. 检查是否有iframe
如果页面上有iframe,确保你已经切换到了正确的iframe中。如果元素位于iframe内,你需要先切换到该iframe,然后再尝试查找元素。
综上所述,你需要检查和调整你的代码,确保你的自动化脚本可以正常工作。
关于第五点操作:
如果一个元素位于
iframe
或frame
内,你必须首先切换到那个iframe
或frame
中,然后才能与该元素交互。这可以使用Selenium的switch_to.frame()
方法完成。
通过索引切换: 如果你知道iframe
在页面上的位置,你可以通过索引来切换。
driver.switch_to.frame(0) # 第一个iframe
通过名称或ID切换: 如果iframe
有name
或id
属性,你可以使用这些属性切换。
driver.switch_to.frame("iframeName")
driver.switch_to.frame("iframeID")
通过元素对象切换: 你还可以首先获取到iframe
的元素对象,然后使用该对象来切换。
iframe_element = driver.find_element(By.TAG_NAME, "iframe")
driver.switch_to.frame(iframe_element)
一旦你完成了iframe
内的操作,你可能需要切回主文档。为此,你可以使用以下命令:
driver.switch_to.default_content()
注意: 如果页面中有多个嵌套的
iframe
,你需要逐个切换,从外层开始,然后逐步进入每一个内层的iframe
。
以下是一个简单的例子,假设有一个外层iframe
和一个内层iframe
:
# 切换到外层iframe
driver.switch_to.frame("outerIframeID")
# 切换到内层iframe
driver.switch_to.frame("innerIframeID")
# 在内层iframe中进行操作...
# ...
# 切换回外层iframe
driver.switch_to.parent_frame()
# 或切换回主文档
driver.switch_to.default_content()
当处理iframe
时,始终确保你已经切换到了正确的iframe
,然后再尝试查找和交互其中的元素。