我默认用的是Chrome浏览器
一、安装selenium和配置Chromedriver
1、安装selenium,直接使用pip安装
pip install selenium
2、chromedriver下载地址:
https://sites.google.com/a/chromium.org/chromedriver/downloads (需要翻墙)
http://npm.taobao.org/mirrors/chromedriver/(阿里的)
注意事项 :chromedriver的版本要与你电脑使用的chrome版本对应,对应关系如下:
ChromeDriver v74.0.3729.6 (2019-03-14) Supports Chrome v74
ChromeDriver v2.46 (2019-02-01) Supports Chrome v71-73
ChromeDriver v2.45 (2018-12-10) Supports Chrome v70-72
ChromeDriver v2.44 (2018-11-19) Supports Chrome v69-71
ChromeDriver v2.43 (2018-10-16) Supports Chrome v69-71
ChromeDriver v2.42 (2018-09-13) Supports Chrome v68-70
chromedriver版本 | 支持的Chrome版本 |
---|---|
v2.41 | v67-69 |
v2.40 | v66-68 |
v2.39 | v66-68 |
v2.38 | v65-67 |
v2.37 | v64-66 |
v2.36 | v63-65 |
v2.35 | v62-64 |
v2.34 | v61-63 |
v2.33 | v60-62 |
v2.32 | v59-61 |
v2.31 | v58-60 |
v2.30 | v58-60 |
v2.29 | v56-58 |
v2.28 | v55-57 |
v2.27 | v54-56 |
v2.26 | v53-55 |
v2.25 | v53-55 |
v2.24 | v52-54 |
v2.23 | v51-53 |
v2.22 | v49-52 |
v2.21 | v46-50 |
v2.20 | v43-48 |
v2.19 | v43-47 |
v2.18 | v43-46 |
v2.17 | v42-43 |
v2.13 | v42-45 |
v2.15 | v40-43 |
v2.14 | v39-42 |
v2.13 | v38-41 |
v2.12 | v36-40 |
v2.11 | v36-40 |
v2.10 | v33-36 |
v2.9 | v31-34 |
v2.8 | v30-33 |
v2.7 | v30-33 |
v2.6 | v29-32 |
v2.5 | v29-32 |
v2.4 | v29-32 |
下载完成后:
windows 下,新建一个命名为chromedriver文件夹,将解压的chromedriver.exe放进文件夹,再配置进path环境变量
Linux下,把下载好的文件放在 /usr/bin 目录下就可以了。
二、浏览器的有界面和无界面设置
1、 有界面
opt = webdriver.Chrome()
2、使用headless无界面浏览器模式
chrome_options = webdriver.ChromeOptions()
chrome_options.add_argument('--headless')
chrome_options.add_argument('--disable-gpu')
# 启动浏览器,获取网页源代码
opt = webdriver.Chrome(chrome_options=chrome_options)
三、不加载图片设置
# 不加载图片设置
options = webdriver.ChromeOptions()
prefs = { 'profile.default_content_setting_values' : { 'images': 2 } }
options.add_experimental_option('prefs',prefs)
opt = webdriver.Chrome(chrome_options = options)
四、selenium定位之iframe中的元素定位
1.iFrame有ID 或者 name的情况
//进入id=”frame1”的frame中,定位id=”div1”的div和id=”input1”的输入框。
dr.switchTo().frame(“frame1”);
dr.findElement(By.id(“div1”));
dr.findElement(By.id(“input1”))
2.如果一个iFrame既没有id,也没有name,通用情况
// 定位frame位置,并选取frame
WebElement frame=driver.findElement(By.xpath( “/html/body/div[2]/div[8]/div[2]/div[3]/div/div[2]/div/iframe” ));
driver.switchTo().frame(frame);
3.跳出iFrame
//跳出frame,进入default content;重新定位id=”id1”的div
dr.switchTo().defaultContent();
dr.findElement(By.id(“id1”))
五、后续补充的整理一些设置集合:
1、谷歌:
1 | from selenium import webdriver |
2 | import os |
3 | |
4 | # 进入浏览器设置 |
5 | options = webdriver.ChromeOptions() |
6 | # 谷歌无头模式 |
7 | options.add_argument('--headless') |
8 | options.add_argument('--disable-gpu') |
9 | # 设置页面大小 |
10 | options.add_argument('window-size=1200x600') |
11 | # 设置中文 |
12 | options.add_argument('lang=zh_CN.UTF-8') |
13 | # 更换头部 |
14 | options.add_argument('user-agent="Mozilla/5.0 (iPod; U; CPU iPhone OS 2_1 like Mac OS X; ja-jp) AppleWebKit/525.18.1 (KHTML, like Gecko) Version/3.1.1 Mobile/5F137 Safari/525.20"') |
15 | # 设置代理 |
16 | options.add_argument('proxy-server=' + proxy) |
17 | # 禁止加载图片 |
18 | chrome_options.add_argument('blink-settings=imagesEnabled=false') |
19 | # 不加载图片 |
20 | options.add_experimental_option('prefs', {"profile.managed_default_content_settings.images": 2}) |
21 | # 设置下载路径 |
22 | options.add_experimental_option('prefs', {"download.default_directory": os.path.abspath('数据\\')}) |
23 | # 除去“正受到自动测试软件的控制” |
24 | options.add_argument('disable-infobars') |
25 | # 打开开发者模式 |
26 | options.add_experimental_option('excludeSwitches', ['enable-automation']) |
27 | # 导入当前py文件目录下的chromedriver |
28 | executable_path = os.path.abspath('chromedriver.exe') |
29 | |
30 | browser = webdriver.Chrome(executable_path=executable_path, chrome_options=options) |
31 | url = "https://httpbin.org/get?show_env=1" |
32 | browser.get(url) |
33 | # 设置浏览器窗口大小 |
34 | browser.set_window_size(1552, 800) |
35 | # 删除原来的cookie |
36 | browser.delete_all_cookies() |
37 | # 添加cookie |
38 | browser.add_cookie({'name':'ABC','value':'DEF'}) |
39 | # 刷新当前页面 |
40 | browser.refresh() |
41 | # 通过js新打开一个窗口 |
42 | page_js='window.open("https://www.baidu.com");' |
43 | browser.execute_script(page_js) |
44 | # 用js点击元素 |
45 | button = browser.find_element_by_xpath('//*[@class="button"]') |
46 | browser.execute_script("$(arguments[0]).click()",button) |
47 | # 用js滑动滑动条 |
48 | js = "var q=document.documentElement.scrollTop=" |
49 | for i in range(1, 15): |
50 | browser.execute_script(js + str(i * 100)) |
51 | # 切换浏览器最新页面窗口 |
52 | browser.switch_to.window(browser.window_handles[-1]) |
53 | # 切换浏览器至第一个iframe框架 |
54 | browser.switch_to.frame(1) |
55 | # 切换浏览器的弹出框 并点击同意 |
56 | self.browser.switch_to.alert.accept() |
57 | # 浏览器窗口对象 |
58 | browser.window_handles: list |
59 | # 关闭当前窗口 |
60 | browser.close() |
61 | # 关闭浏览器 |
62 | browser.quit() |
2、火狐浏览器:
1 | from selenium.webdriver.common.proxy import * |
2 | # 代理 |
3 | myProxy = '202.202.90.20:8080' |
4 | # 代理格式 |
5 | proxy = Proxy({ |
6 | 'proxyType': ProxyType.MANUAL, |
7 | 'httpProxy': myProxy, |
8 | 'ftpProxy': myProxy, |
9 | 'sslProxy': myProxy, |
10 | 'noProxy': '' |
11 | }) |
12 | |
13 | profile = webdriver.FirefoxProfile() |
14 | profile = get_firefox_profile_with_proxy_set(profile, proxy) |
15 | profile.set_preference("general.useragent.override", user_agent) |
16 | |
17 | # firefox无头模式 |
18 | options = webdriver.FirefoxOptions() |
19 | options.add_argument('--headless') |
20 | options.add_argument('--disable-gpu') |
21 | options.add_argument('window-size=1200x600') |
22 | executable_path = os.path.abspath('geckodriver.exe') |
23 | |
24 | driver=webdriver.Firefox(proxy=proxy, profile=profile, |
25 | options=options, executable_path=executable_path) |
26 | driver.get('https://www.baidu.com') |
27 | driver.quit() |
28 | |
29 | # 火狐浏览器不加载图片 |
30 | from selenium import webdriver |
31 | options=webdriver.FirefoxProfile() |
32 | options.set_preference(‘permissions.default.image’,2) |
33 | b=webdriver.Firefox(options) |
34 | |
35 | # 找到的另外一些设置方法 |
36 | from selenium import webdriver |
37 | # 浏览器选项 |
38 | firefox_options = webdriver.FirefoxOptions() |
39 | # 使用headless无界面浏览器模式 |
40 | firefox_options.add_argument('--headless') |
41 | # 谷歌文档提到需要加上这个属性来规避bug |
42 | firefox_options.add_argument('--disable-gpu') |
43 | # 设置默认编码为utf-8 |
44 | firefox_options.add_argument('lang=zh_CN.UTF-8') |
45 | # 隐藏滚动条, 应对一些特殊页面 |
46 | firefox_options.add_argument('--hide-scrollbars') |
47 | # 禁止加载图片 |
48 | firefox_options.add_argument('blink-settings=imagesEnabled=false') |
49 | # 指定浏览器分辨率 |
50 | firefox_options.add_argument('window-size=1440x900') |
51 | # driver.maximize_window() |
52 | # 设置默认请求头 |
53 | firefox_options.add_argument('user-agent="Mozilla/5.0 (iPhone; CPU iPhone OS 9_1 like Mac OS X)AppleWebKit/601.1.46 (KHTML, like Gecko) Version/9.0 Mobile/13B143 Safari/601.1"') |
54 | # 设置代理 |
55 | desired_capabilities = firefox_options.to_capabilities() |
56 | desired_capabilities['proxy'] = { |
57 | "httpProxy":PROXY, |
58 | "ftpProxy":PROXY, |
59 | "sslProxy":PROXY, |
60 | "noProxy":None, |
61 | "proxyType":"MANUAL", |
62 | "class":"org.openqa.selenium.Proxy", |
63 | "autodetect":False |
64 | } |
65 | # 启动浏览器,获取网页源代码 |
66 | driver = webdriver.Firefox(firefox_options=firefox_options) |
67 | |
68 | |
69 | # 另一种设置代理方法: |
70 | profile=webdriver.FirefoxOptions() |
71 | profile.add_argument('-headless') #设置无头模式 |
72 | #设置代理服务器 |
73 | profile.set_preference('network.proxy.type', 1) |
74 | profile.set_preference('network.proxy.http',IP)#IP为你的代理服务器地址:如‘127.0.0.0’,字符串类型 |
75 | profile.set_preference('network.proxy.http_port', PORT) #PORT为代理服务器端口号:如,9999,整数类型 |
76 | browser=webdriver.Firefox(options=profile) |
3、常用操作:
1 | # 清除数据 |
2 | self.browser.find_element_by_id("TPL_username_1").clear() |
3 | # 输入数据 |
4 | self.browser.find_element_by_id("TPL_username_1").send_keys(f'{i}') |
5 | # 点击 |
6 | self.browser.find_element_by_id("J_SubmitStatic").click() |
7 | # xpath获取 |
8 | self.browser.find_element_by_xpath(f'//*[@id="J_QRCodeLogin"]/div[5]/a[1]').click() |
9 | # 鼠标点击 |
10 | from selenium.webdriver import ActionChains |
11 | ac = self.browser.find_element_by_xpath('//*[@id="my-page"]/div/div/div/span[1]') |
12 | ActionChains(self.browser).move_to_element(ac).click(ac).perform() |
13 | # 动态加载 下拉 |
14 | self.browser.execute_script("window.scrollBy(0,1000)") |
15 | time.sleep(1) |
16 | self.browser.execute_script("window.scrollBy(0,2000)") |
17 | time.sleep(2) |
18 | self.browser.execute_script("window.scrollBy(0,3000)") |
19 | time.sleep(0.5) |
20 | self.browser.execute_script("window.scrollBy(0,4000)") |
21 | time.sleep(0.5) |
22 | self.browser.execute_script("window.scrollBy(0,5000)") |
23 | time.sleep(0.5) |
24 | self.browser.execute_script("window.scrollBy(0,6000)") |
25 | # 模拟键盘操作 |
26 | from selenium.webdriver.common.keys import Keys |
27 | self.browser.find_element_by_id("TPL_username_1").send_keys(Keys.NUMPAD5) |
28 | Keys.BACK_SPACE # 回退键(BackSpace) |
29 | Keys.TAB # 制表键(Tab) |
30 | Keys.ENTER # 回车键(Enter) |
31 | Keys.SHIFT # 大小写转换键(Shift) |
32 | Keys.CONTROL # Control键(Ctrl) |
33 | Keys.ALT # ALT键(Alt) |
34 | Keys.ESCAPE # 返回键(Esc) |
35 | Keys.SPACE # 空格键(Space) |
36 | Keys.PAGE_UP # 翻页键上(Page Up) |
37 | Keys.PAGE_DOWN # 翻页键下(Page Down) |
38 | Keys.END # 行尾键(End) |
39 | Keys.HOME # 行首键(Home) |
40 | Keys.LEFT # 方向键左(Left) |
41 | Keys.UP # 方向键上(Up) |
42 | Keys.RIGHT # 方向键右(Right) |
43 | Keys.DOWN # 方向键下(Down) |
44 | Keys.INSERT # 插入键(Insert) |
45 | DELETE # 删除键(Delete) |
46 | NUMPAD0 ~ NUMPAD9 # 数字键1-9 |
47 | F1 ~ F12:F1 - F12键 # |
48 | (Keys.CONTROL, ‘a’) # 组合键Control+a,全选 |
49 | (Keys.CONTROL, ‘c’) # 组合键Control+c,复制 |
50 | (Keys.CONTROL, ‘x’) # 组合键Control+x,剪切 |
51 | (Keys.CONTROL, ‘v’) # 组合键Control+v,粘贴 |
参考的网站有:
https://www.cnblogs.com/lijuanfei/p/10372651.html
https://www.cnblogs.com/wuhl-89/p/9453885.html
https://blog.csdn.net/yoyocat915/article/details/80580066
https://blog.csdn.net/ircszwfcbvdgk234/article/details/78605052
https://blog.csdn.net/zin521/article/details/82177874
http://blog.sina.com.cn/s/blog_68f262210101mcxp.html
https://blog.csdn.net/weixin_32759777/article/details/84569767
https://www.cnblogs.com/yoyo1216/p/10136043.html