💎一站式轻松地调用各大LLM模型接口,支持GPT4、智谱、星火、月之暗面及文生图 广告
# Selenium常见操作 * [演示网站](http://brtc.imsam.cn/1378009#_1) * [打开网址 get()](http://brtc.imsam.cn/1378009#_get_8) * [最大化窗口](http://brtc.imsam.cn/1378009#_9) * [关闭浏览器](http://brtc.imsam.cn/1378009#_10) * [点击 click()](http://brtc.imsam.cn/1378009#__click_28) * [输入内容 send\_keys()](http://brtc.imsam.cn/1378009#_send_keys_29) * [清空输入的内容 clear()](http://brtc.imsam.cn/1378009#_clear_60) * [is\_displayed() 判断元素是否显示/可见](http://brtc.imsam.cn/1378009#is_displayed__79) * [text 返回元素的文本](http://brtc.imsam.cn/1378009#text__105) * [多表单切换](http://brtc.imsam.cn/1378009#_129) * [隐式等待](http://brtc.imsam.cn/1378009#_165) * [警告框 alert](http://brtc.imsam.cn/1378009#_alert_184) * [下拉框元素定位](http://brtc.imsam.cn/1378009#_229) * [send\_keys() 上传文件](http://brtc.imsam.cn/1378009#send_keys__278) * [get\_attribute("属性") 获取属性对应值](http://brtc.imsam.cn/1378009#get_attribute__307) * [鼠标悬停](http://brtc.imsam.cn/1378009#_329) * [多窗口处理](http://brtc.imsam.cn/1378009#_361) * [定位一组元素 find\_elements\_by\_xxx](http://brtc.imsam.cn/1378009#_find_elements_by_xxx_395) * [JS定位](http://brtc.imsam.cn/1378009#JS_429) * [JS定位](http://brtc.imsam.cn/1378009#JS_439) > ### 演示网站 `http://OS-201804081018/blog/wp-login.php` 用户名:`test` 密码:`test123` * [http://os-201804081018/test.html](http://os-201804081018/test.html) > ### 打开网址 get() > > ### 最大化窗口 > > ### 关闭浏览器 ~~~ from selenium import webdriver #打开谷歌浏览器,并且赋值给变量d d = webdriver.Chrome() d.maximize_window()# 最大化窗口 # 通过get() 打开一个网址 d.get('https://www.baidu.com') # 关闭当前窗口 d.close() # 关闭所有窗口,并且关闭驱动 d.quit() ~~~ > ### 点击 click() > > ### 输入内容 send\_keys() ~~~ from selenium import webdriver from time import sleep #打开谷歌浏览器,并且赋值给变量d d = webdriver.Chrome() d.maximize_window()# 最大化窗口 # 通过get() 打开一个网址 d.get('https://www.baidu.com') sleep(2) # 定位到hao123 # d.find_element_by_link_text('hao123').click() d.find_element_by_partial_link_text('ao12').click() sleep(2) # 输入内容 send_keys() d.find_element_by_name('word').send_keys('Python自动化') sleep(2) # 点击百度一下 d.find_element_by_class_name('submitInput').click() sleep(2) # 关闭当前窗口 d.close() # 关闭所有窗口,并且关闭驱动 d.quit() ~~~ > ### 清空输入的内容 clear() ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.get('http://os-201804081018/blog/wp-login.php') d.maximize_window() sleep(2) # 输入用户名 d.find_element_by_tag_name('input').send_keys('brtc') sleep(1) d.find_element_by_tag_name('input').send_keys('123456') sleep(2) # 清空内容 clear() d.find_element_by_tag_name('input').clear() ~~~ > ### is\_displayed() 判断元素是否显示/可见 如果元素可见,则返回True,否则返回False 注意 :不管元素是否可见,我们都是可以定位到的。只是不可见的元素,我们是无法进行操作。 | 隐藏元素属性 | | --- | | type="hidden" | | style="display:none" | ~~~ from selenium import webdriver d = webdriver.Chrome() d.get('http://os-201804081018/blog/wp-login.php') result = d.find_element_by_css_selector('#wp-submit').is_displayed() result2 = d.find_element_by_css_selector('[name="redirect_to"]').is_displayed() print(result) print(result2) ~~~ > ### text 返回元素的文本 使用`text`会返回元素的文本信息 ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.get('http://os-201804081018/blog/wp-login.php') # 登录系统 d.find_element_by_css_selector('#user_login').send_keys('test') sleep(1) d.find_element_by_css_selector('input[type="password"]').send_keys('te151254st123') sleep(2) d.find_element_by_css_selector('p.submit input#wp-submit').click() sleep(1) # 获取元素的文本信息 login_msg = d.find_element_by_css_selector('#login_error').text print(login_msg) ~~~ > ### 多表单切换 * 切换表单`switch_to.frame()` * 切换到最外层表单`switch_to.default_content()` ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.get('http://os-201804081018/test.html') # 需要切换到的表单 frame_ele = d.find_element_by_css_selector('#fr_1') # 切换表单 d.switch_to.frame(frame_ele) sleep(1) d.find_element_by_css_selector('[name="kw"]').send_keys('随便输入一些内容') sleep(1) # 切换到最外层表单 d.switch_to.default_content() sleep(1) d.find_element_by_css_selector('.btn').click() sleep(1) d.close() d.quit() ~~~ > ### 隐式等待 `implicitly_wait(n)`n为秒数 隐式等待,是通过一定的时长等待页面的某个元素加载完成。如果超出了设置的时长,元素还没有被加载出来,则抛出异常。 ~~~ from selenium import webdriver d = webdriver.Chrome() d.implicitly_wait(10)#等待十秒加载不出来就会抛出异常,10秒内加载出来正常返回 d.get('https://www.zhihu.com/explore') d.find_element_by_class_name('zu-top-add-question') ~~~ > ### 警告框 alert * switch\_to.alert.accept() * switch\_to.alert.dismiss() * switch\_to.alert.text ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.maximize_window() # 隐式等待 d.implicitly_wait(10) d.get('http://os-201804081018/test.html') sleep(3) d.find_element_by_css_selector('#Button1').click() sleep(1) # 处理警告框 switch_to.alert # 确定警告框 accept() # 取消警告框 dismiss() # 获取警告框文本信息 msg = d.switch_to.alert.text print(msg) # 确定警告框 accept() d.switch_to.alert.accept() d.find_element_by_css_selector('#Button1').click() sleep(1) # 取消警告框 dismiss() d.switch_to.alert.dismiss() sleep(1) d.close() d.quit() ~~~ > ### 下拉框元素定位 * 通用处理方法:先点击下拉框,再点击下拉框的选项 * 针对select标签的下拉框,selenium提供了一套解决方案 需要先导包`from selenium.webdriver.support.ui import Select` 语法: ~~~ Select(下拉框元素定位).select_by_index(下标)#根据下标选择 Select(下拉框元素定位).select_by_visible_text('文本信息')#根据文本选择 Select(下拉框元素定位).select_by_value('value的值')# 根据value的值来选择 ~~~ 示例: ~~~ from selenium import webdriver from time import sleep from selenium.webdriver.support.ui import Select#解决select标签下拉框 d = webdriver.Chrome() d.maximize_window() # 隐式等待 d.implicitly_wait(10) d.get('http://os-201804081018/test.html') sleep(3) # 先定位到下拉框 sel_ele = d.find_element_by_css_selector('#s1') # 根据下标选择 Select(sel_ele).select_by_index(2) sleep(3) #根据文本选择 Select(sel_ele).select_by_visible_text('自动化持续集成') sleep(3) # 根据value的值来选择 Select(sel_ele).select_by_value('brtc1') sleep(3) d.close() d.quit() ~~~ > ### send\_keys() 上传文件 只针对input标签的上传文件 ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.maximize_window() # 隐式等待 d.implicitly_wait(10) d.get('http://www.baidu.com') sleep(3) d.find_element_by_css_selector('.soutu-btn').click() sleep(3) # 定位到文件上传的按钮,直接send_keys('文件的路径') d.find_element_by_css_selector('.upload-pic').send_keys(R'D:\zhifubao.png') sleep(3) d.close() d.quit() ~~~ > ### get\_attribute("属性") 获取属性对应值 根据属性名称获取对应值 ~~~ from selenium import webdriver from time import sleep d = webdriver.Chrome() d.maximize_window() d.get('http://os-201804081018/blog/wp-login.php') sleep(3) username_type = d.find_element_by_css_selector('#user_login').get_attribute('type') print(username_type) sleep(3) d.close() d.quit() ~~~ > ### 鼠标悬停 使用该方法,首先要把ActionChains类导进来,引入ActionChains类的方法如下: `from selenium.webdriver import ActionChains` 语法: `ActionChains(浏览器).move_to_element(需要悬停的元素).perform()` ~~~ from selenium import webdriver from time import sleep from selenium.webdriver import ActionChains#鼠标悬停需要先导包 #打开谷歌浏览器,并且赋值给变量d d = webdriver.Chrome() d.maximize_window()# 最大化窗口 # 通过get() 打开一个网址 d.get('https://www.baidu.com') sleep(2) # 先定位到需要悬停的元素 mte = d.find_element_by_link_text('设置') # 鼠标悬停 # 语法: ActionChains(浏览器).move_to_element(需要悬停的元素).perform() ActionChains(d).move_to_element(mte).perform() ~~~ > ### 多窗口处理 如果遇到多窗口处理,我们就要切换窗口了。 `window_handles`获取所有窗口,以列表的形式返回 `switch_to.window()`切换窗口 ~~~ from selenium import webdriver from time import sleep #打开谷歌浏览器,并且赋值给变量d d = webdriver.Chrome() d.maximize_window()# 最大化窗口 d.get('https://www.jianshu.com/') sleep(1) d.find_element_by_css_selector('#q').send_keys('python3') d.find_element_by_css_selector('.ic-search').click() # 获取所有窗口window_handles 会以列表返回所有窗口 all_windows = d.window_handles print(all_windows) # 使用switch_to.window() d.switch_to.window(all_windows[1]) sleep(3) d.find_element_by_css_selector('#q').clear() sleep(5) ~~~ > ### 定位一组元素 find\_elements\_by\_xxx find\_elements可以找到所有符合规则的元素,并且以列表的形式返回。 ~~~ from selenium import webdriver from time import sleep #打开谷歌浏览器,并且赋值给变量d d = webdriver.Chrome() d.maximize_window()# 最大化窗口 d.get('http://os-201804081018/blog/wp-login.php') # 登录系统 d.find_element_by_css_selector('#user_login').send_keys('test') sleep(1) d.find_element_by_css_selector('input[type="password"]').send_keys('test123') sleep(2) d.find_element_by_css_selector('p.submit input#wp-submit').click() sleep(1) d.find_element_by_css_selector('#menu-users .wp-menu-name').click() sleep(3) # find_elements... 定位一组元素,所有拥有该属性的都定位到,以列表的方式返回 all_user = d.find_elements_by_css_selector('[name="users[]"]') for i in range(0,5,2): all_user[i].click() sleep(0.5) ~~~ > ### JS定位 在selenium中执行JavaScript语句需要使用`execute_script(js语句)`来执行 ~~~ window.scrollTo(a,b); document.querySelector('CSS表达式').removeAttribute('需要移除的属性名称'); document.querySelectorAll('CSS表达式')[下标].removeAttribute('移除的属性名称'); ~~~ > ### JS定位 在selenium中执行JavaScript语句需要使用`execute_script(js语句)`来执行 ~~~ window.scrollTo(0,b); ~~~ 滚动条JS语句`window.scrollTo(0,b);` * b 表示滚动条与顶部距离 ~~~ from selenium import webdriver from time import sleep #打开谷歌浏览器,并且赋值给变量d d = webdriver.Chrome() d.maximize_window()# 最大化窗口 d.get('https://www.jianshu.com/') sleep(1) # 把滚动条往下拉到300的距离 js = "window.scrollTo(0,300);" # 执行js语句 d.execute_script(js) sleep(2) # 把滚动条往下拉到3000的距离 js2 = "window.scrollTo(0,3000);" # 执行js语句 d.execute_script(js2) sleep(2) # 把滚动条往下拉到0的距离 js3 = "window.scrollTo(0,0);" # 执行js语句 d.execute_script(js3) sleep(2) ~~~ * 定位一个元素,然后取出某个属性 ~~~ document.querySelector('CSS表达式').removeAttribute('需要移除的属性名称'); ~~~ ~~~ from selenium import webdriver from time import sleep #打开谷歌浏览器,并且赋值给变量d d = webdriver.Chrome() d.maximize_window()# 最大化窗口 d.get('http://os-201804081018/test.html') sleep(1) js = "document.querySelector('#s3').removeAttribute('style');" d.execute_script(js) ~~~ * 定位一组元素,通过下标,来确定 ~~~ document.querySelectorAll('CSS表达式')[下标].removeAttribute('移除的属性名称'); ~~~ ~~~ #coding=utf-8 # @Author: SamWang # @Date: 2019-11-14 10:54:44 # @Last Modified time: 2019-11-15 12:02:25 from selenium import webdriver from time import sleep d = webdriver.Chrome() d.get('http://os-201804081018/blog/wp-login.php') d.maximize_window() sleep(1) # 登录系统 d.find_element_by_css_selector('#user_login').send_keys('test') sleep(1) d.find_element_by_css_selector('input[type="password"]').send_keys('test123') sleep(1) d.find_element_by_css_selector('p.submit input#wp-submit').click() sleep(1) d.get('http://os-201804081018/blog/wp-admin/users.php') sleep(1) js = '''document.querySelectorAll('[name="users[]"]')[1].removeAttribute('type');''' d.execute_script(js) ~~~