本文使用环境:windows11、Python 3.10.5、PyCharm 2022.1.3、Selenium 4.3.0
需要你懂的技术:Python、HTML、CSS、JavaScript
在PyCharm终端或window命令窗口输入以下命令
#查看已安装的Python包(可跳过) pip list #安装selenium 4.3.0 pip install selenium==4.3.0
注意:在window命令窗口安装时,首先要确保Python环境变量配置正确
##卸载Selenium命令 pip uninstall selenium
在PyCharm中新建一个Python文件,自行命名,输入以下代码:
import time # 导入selenium包 from selenium import webdriver # 打开Firefox浏览器 browser = webdriver.Firefox() # 停留三秒 time.sleep(3) # 关闭浏览器 browser.quit()
执行后,Firefox浏览器将被打开,证明Selenium安装配置完成
# 打开Chome浏览器 browser = webdriver.Chrome() # 关闭浏览器 browser.quit()
# 打开Edge浏览器 browser = webdriver.Edge() # 关闭浏览器 browser.quit()
import time # 导入selenium包 from selenium import webdriver # 打开指定(Firefox)浏览器 browser = webdriver.Firefox() # 指定加载页面 browser.get("http://www.csdn.net/") # 设置五秒后执行下一步 time.sleep(5) # 关闭浏览器 browser.quit()
元素定位方法包含了2个系列:
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 打开指定(Firefox)浏览器 browser = webdriver.Firefox() # 指定加载页面 browser.get("http://www.csdn.net") # 通过id属性获取搜索输入框 input_text = browser.find_element(By.ID, "toolbar-search-input") # 向搜索输入框内输入selenium input_text.send_keys("selenium") # 设置停留五秒后执行下一步 time.sleep(5) # 关闭浏览器 browser.quit()
find_element(By.NAME,‘xx’)name定位,根据元素的name属性值定位,定位到的标签不一定是唯一的。
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.baidu.com/") # 通过name属性选择文本框元素,并设置内容 browser.find_element(By.NAME,'wd').send_keys("selenium") # 通过通过ID属性获取“百度一下”按钮,并执行点击操作 browser.find_element(By.ID,"su").click() # 停留五秒后关闭浏览器 time.sleep(5) browser.quit()
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.baidu.com/") time.sleep(2) # 通过class属性选择元素 browser.find_element(By.CLASS_NAME,'s_ipt').send_keys("CSDN") time.sleep(2) browser.find_element(By.ID,"su").click() # 停留三秒后关闭浏览器 time.sleep(3) browser.quit()
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") time.sleep(2) # 选择标签(搜索按钮),执行点击操作 browser.find_element(By.TAG_NAME, "button").click() # 停留三秒后关闭浏览器 time.sleep(3) browser.quit()
(1)、By.LINK_TEXT精确定位
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 选择Python标签,执行点击操作 browser.find_element(By.LINK_TEXT, "Python").click() # 停留三秒后关闭浏览器 time.sleep(3) browser.quit()
(2)By.PARTIAL_LINK_TEXT模糊定位
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 选择人工智能标签,执行点击操作 browser.find_element(By.PARTIAL_LINK_TEXT, "人工").click() # 停留五秒后关闭浏览器 time.sleep(3) browser.quit()
xpath是一种在XML文档中定位元素的语言
使用绝对路径定位
指的是从网页的HTML代码结构的最外层一层层的写到需要被定位的页面元素为止。
绝对路径起始于/,每一层都被/所分割。
/html/body/div[2]/form/input[3]
注解:
(1)可以用中括号选择分支,div[2]代表的是当前层级下的第二个div标签;
(2)一般情况下较少使用绝对路径的方式做定位,原因在于绝对路径的表达式一般太长,不便于后期的代码维护,代码的微小改变就可能导致这个路径失效,从而无法完成元素定位。
使用相对路径定位
不是从根目录写起,而是从网页文本的任意目录开始写。
相对路径起始于//,//所表示的含义是“任意标签下”
//input[@id=‘kw’]
注解:
(1)示例的含义:在当前页面查找任意目录下的input元素,且该元素的id属性取值为kw
(2)在xpath里,属性以@开头
(3)所选取的属性可以是任意属性,只要其有利于标识这个元素即可
(4)推荐使用相对路径结合属性的这种xpath表达式,它往往更简洁更易于维护
(5)有时候可能会出现一个属性不足以标识某个元素,可以使用逻辑运算符and来连接多个属性进行标识。//input[@xx=‘aa’ and @yy=‘bb’]
(6)有时候一个元素它本身没有可以唯一标识它的属性,这时我们可以找它的上层或者上上层, 然后再往下写。//input[@xx=‘aa’]/p
find_element(By.XPATH,‘XX’)根据元素的xpath表达式来完成定位,可以准确定位任何元素。
打开CSDN首页,按F12进入开发者模式,我们可以按照下图所示获取元素的xpath路径,我这里定位的是搜索框的xpath。
点击后会存在与剪切板中,Ctrl+v粘贴到代码中即可使用,这里获取到的是相对路径。
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 通过xpath定位输入框,输入内容selenium browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys('selenium') # 停留五秒后关闭浏览器 time.sleep(5) browser.quit()
注意:对于css的属性值来说,可以加引号也可以不加,注意属性的引号和整个CSS表达式的引号要进行区分。对于xpath的属性值来讲,需要加上引号,否则报错。
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 通过css选择器定位输入框,输入内容selenium browser.find_element(By.CSS_SELECTOR, '#toolbar-search-input').send_keys('selenium') # 停留三秒后关闭浏览器 time.sleep(3) browser.quit()
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 通过css选择器定位输入框 input_text = browser.find_element(By.CSS_SELECTOR,'#toolbar-search-input') # 输入文本 input_text.send_keys("selenium") # 停留2秒 time.sleep(2) # 清空文本 input_text.clear() # 停留三秒后关闭浏览器 time.sleep(3) browser.quit()
- 注意:submit()只能用于包含属性type='submit’的标签,并且嵌套在form表单中。
- 也可以使用click()代替submit()使用。
- 注意:submit()和click()是有很大区别的,这里不再做具体说明。
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.bing.com") # 通过xpath选择器定位输入框,并输入CSDN input_text = browser.find_element(By.XPATH,'//*[@id="sb_form_q"]').send_keys("CSDN") time.sleep(2) # 定位提交按钮后提交 browser.find_element(By.XPATH,'//*[@id="sb_form_go"]').submit() # 停留3秒后关闭 time.sleep(3) browser.quit()
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 获取标题 title = browser.title # 输出 print(title) # 获取源代码 source_code = browser.page_source #输出源代码 print(source_code) # 获取页面链接 url = browser.current_url #输出页面链接 print(url) # 获取标签内文本 text = browser.find_element(By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/div/button/span').text print(text) # 关闭页面 time.sleep(3) browser.quit()
输出结果太多,这里不在展示,自行在PyCharm上演示。
implicitly_wait(N)通过一定时长等待页面元素加载,最大等待时长N秒,如果中间某个时刻元素加载好了,就会结束等待,执行下一步操作;如果超出设置时间元素没加载出来,抛出没有这样的元素异常。
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 隐式等待 browser.implicitly_wait(5) # 关闭页面 browser.quit() time.sleep(3)
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") # 窗口最大化 browser.maximize_window() #停留2秒 time.sleep(2) #窗口最小化 browser.minimize_window() # 指定窗口尺寸 browser.set_window_size(300, 500) # 关闭页面 time.sleep(3) browser.quit()
forward()前进一页。
back()后退一页。
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") browser.find_element(By.LINK_TEXT, 'Python').click() #停留2秒 time.sleep(2) # 页面后退一页 browser.back() # 停留2秒 time.sleep(2) # 前进一页 browser.forward() # 关闭页面 time.sleep(3) browser.quit()
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") browser.find_element(By.LINK_TEXT, 'Python').click() #停留2秒 time.sleep(2) # 页面刷新 browser.refresh() # 关闭页面 time.sleep(3) browser.quit()
from time import sleep # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("http://www.csdn.net") sleep(2) # 获取当前窗口句柄 page_context = browser.current_window_handle # 打开其它页面 browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]').send_keys('selenium') browser.find_element(By.XPATH, '/html/body/div[1]/div/div/div/div[2]/div/div/button/span').click() sleep(2) # 切换到刚开始打开页面 browser.switch_to.window(page_context) # 获取当前打开所有页面的句柄 pages_context = browser.window_handles # 输出当前打开页面个数 print(len(pages_context)) # 结果:2 # 关闭 sleep(3) browser.quit()
选取框架内元素,首先我们要定位到框架元素,然后切换到框架页面,才能对框架页面内元素进行操作。
由于找不到内敛框架的页面,这里我自己简单写了个页面。下边是HTML源码,操作时注意路径get()内url不要写错。
frame内敛框架页面 这是框架frame外:
from time import sleep # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("file:///C:/Users/admin/Desktop/frame.html") sleep(2) # 定位到iframe标签 tag_iframe = browser.find_element(By.TAG_NAME, 'iframe') # 切换到iframe框架页面内 browser.switch_to.frame(tag_iframe) # 定位到框架内搜索框并输入内容 browser.find_element(By.LINK_TEXT, 'Python').click() sleep(2) # 从内敛框架页面切出 browser.switch_to.parent_frame() browser.find_element(By.XPATH, "//input").send_keys("这是框架外面!") # 关闭浏览器 sleep(3) browser.quit()
用户名: 密码: Java Python C++ JavaScript HTML
import time # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("file:///C:/Users/admin/Desktop/checkbox.html") # 定位input标签 tag_input = browser.find_elements(By.TAG_NAME, 'input') # 通过type属性的值来定位元素,并进行选取 for type_value in tag_input: # 输出input标签的name属性的值: print(type_value.get_attribute("name")) # 对复选框进行选取操作 if type_value.get_attribute("type") == "checkbox": type_value.click() time.sleep(2) # 关闭浏览器 time.sleep(3) browser.quit()
user_name pwd Java Python C++ JavaScript HTML
编程语言:
from time import sleep # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 导入Select类 from selenium.webdriver.support.select import Select # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("file:///C:/Users/admin/Desktop/select.html") # 定位下拉列表标签,并创建下拉列表对象 select = Select(browser.find_element(By.TAG_NAME, "select")) # 通过value属性选择选项 select.select_by_value("Python") sleep(2) # 通过文本内容选择选项 select.select_by_visible_text("C++") sleep(2) # 通过选项索引号选择选项 select.select_by_index(0) # 等同于 select.options[0].click() sleep(2) # 通过options属性循环选取 for i in select.options: i.click() sleep(2) # 关闭浏览器 sleep(3) browser.quit()
页面HTML源码
Python源码
from time import sleep # 导入selenium包 from selenium import webdriver from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("file:///C:/Users/admin/Desktop/alert.html") # alert()弹窗处理 browser.find_element(By.ID, "alert").click() sleep(2) # 获取弹窗对象 alert = browser.switch_to.alert # 输出弹窗内容 print(alert.text) # 结果:这是alert()弹窗! # 确认弹窗 alert.accept() sleep(2) # confirm()弹窗 browser.find_element(By.ID, "confirm").click() sleep(2) # 获取弹窗对象 confirm = browser.switch_to.alert # 输出弹窗内容 print(confirm.text) # 这是confirm()弹窗! # 执行性弹窗的取消按钮 confirm.dismiss() # confirm.accept() # 执行弹窗确认按钮 sleep(2) # prompt()弹窗 browser.find_element(By.ID, "prompt").click() sleep(2) # 获取弹窗对象 prompt = browser.switch_to.alert # 输出弹窗内容 print(prompt.text) # 这是prompt()弹窗! # 向弹窗的输入框内输入内容 prompt.send_keys("这是弹窗prompt()") sleep(2) # 执行性弹窗的确认按钮 prompt.accept() # 关闭浏览器 sleep(3) browser.quit()
鼠标操作涉及到的类:ActionChains类
move_to_element(X)鼠标悬停,X代表定位到的标签
double_click(X)双击
context_click(X)右击
perform() 执行所有存储在ActionChains()类中的行为,做最终的提交
不管执行哪个方法,最后都要调用perform()方法,将操作呈现出来。
from time import sleep # 导入selenium包 from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("https://www.csdn.net") sleep(2) # 创建ActionChains对象 action = ActionChains(browser) # 定位标签并将鼠标移入,并呈现移入结果 tag = browser.find_element(By.XPATH, '//div/a[@class="btn-write-new"]') action.move_to_element(tag).perform() sleep(3) tag = browser.find_element(By.CSS_SELECTOR, '.blog-nav-box') action.move_to_element(tag).perform() sleep(2) browser.find_element(By.LINK_TEXT, "数学").click() # 关闭浏览器 sleep(2) browser.quit()
from time import sleep # 导入selenium包 from selenium import webdriver from selenium.webdriver import ActionChains, Keys from selenium.webdriver.common.by import By # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("https://www.csdn.net") sleep(2) input_text = browser.find_element(By.XPATH, '//*[@id="toolbar-search-input"]') input_text.send_keys("selenium") sleep(2) input_text.send_keys(Keys.CONTROL, "a") # 全选 sleep(2) input_text.send_keys(Keys.CONTROL, 'x') # 剪切 sleep(2) input_text.send_keys(Keys.CONTROL, 'v') # 粘贴 sleep(2) input_text.send_keys(Keys.BACK_SPACE) # 回退一格 # 关闭浏览器 sleep(2) browser.quit()
from time import sleep # 导入selenium包 from selenium import webdriver # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("https://www.csdn.net") sleep(2) # 执行js弹窗代码 browser.execute_script("alert('这是js弹窗代码')") sleep(2) browser.switch_to.alert.accept() sleep(2) # 执行js窗口滚动条代码 browser.execute_script("window.scrollTo(20,1000)") sleep(2) # 打开多个窗口 browser.execute_script("window.open('https://www.baidu.com')") browser.execute_script("window.open('https://www.bing.com')") sleep(2) browser.quit()
from time import sleep # 导入selenium包 from selenium import webdriver # 启动并打开指定页面 browser = webdriver.Firefox() browser.get("https://www.csdn.net") sleep(2) # 浏览器窗口截屏 browser.get_screenshot_as_file("csdn.png") sleep(2) browser.quit()
from selenium import webdriver from time import sleep from selenium.webdriver.common.by import By from selenium.webdriver.support.wait import WebDriverWait from selenium.webdriver.support import expected_conditions as EC browser = webdriver.Firefox() sleep(2) # 打开csdn首页 browser.get("https://www.csdn.net") tag = WebDriverWait(browser, 5, 0.5).until(EC.presence_of_element_located((By.XPATH, '//*[@id="toolbar-search-input"]'))) tag.send_keys("selenium") #关闭 sleep(2) browser.quit()
最后给大家分享一下我的一些学习资料:
以上内容,对于软件测试的朋友来说应该是最全面最完整的备战仓库了,为了更好地整理每个模块,我也参考了很多网上的优质博文和项目,力求不漏掉每一个知识点,很多朋友靠着这些内容进行复习,拿到了BATJ等大厂的offer,这个仓库也已经帮助了很多的软件测试的学习者,希望也能帮助到你。
关注下方我的微信公众号免费领取!↓ ↓ ↓ ↓ ↓