Web自动化测试selenium+python

📅 2026/7/19 10:01:27
Web自动化测试selenium+python
总目录一、selenium是什么二、selenium自动化环境安装三、简单示例四、选择元素的基本方法1、根据 id属性 选择元素。2、根据 class属性 选择元素3、根据 tag名 选择元素五、等待界面元素出现六、操控元素七、CSS表达式选择元素八、选择语法联合使用九、组选择十、按次序选择子节点十一、兄弟节点选择一、selenium是什么Selenium 是一个开源的自动化测试工具专门用于Web应用程序的测试。它允许测试脚本包括python、Java、JavaScript等直接在浏览器中运行模拟真实用户的操作。Selenium 的自动化原理是这样的二、selenium自动化环境安装1、安装客户端库不同的编程语言选择不同的selenium客户端库这里我们用的是python语言打开pycharm点击左下角的python3.11再点击interpreter Settings...在左边找到python interpreter再点击右边的加号在搜索框中搜索selenium点击install Package等待下载就好了。2、安装主流浏览器和浏览器驱动Chrome、Edge、Firefox等我用的是自带的浏览器edge点击下方链接可以下载edge浏览器驱动https://developer.microsoft.com/en-us/microsoft-edge/tools/webdriver/?formMA13LH下载完成之后将压缩包解压到无中文无空格的目录下将浏览器驱动所在目录添加到环境变量的path中。三、简单示例fromseleniumimportwebdriver# 从库中导入相应的包webdriverwebdriver.Edge()# 创建浏览器驱动对象webdriver.get(http://www.baidu.com)# 浏览器驱动打开百度网页input()# 程序运行完成会自动关闭浏览器加一个输入代码可以看到被打开的网页四、选择元素的基本方法web界面自动化先要定位元素才能操作元素。特别注意Selenium 升级到版本 4 以后 下面这种 find_element_by* 方法都作为过期不赞成的写法# 初始化代码 ....wd.find_element_by_id(username).send_keys(byhy)wd.find_element_by_class_name(password).send_keys(sdfsdf)wd.find_element_by_tag_name(input).send_keys(sdfsdf)wd.find_element_by_css_selector(button[typesubmit]).click()运行会有告警所以现在都要写成下面这种格式fromselenium.webdriver.common.byimportBy# 初始化代码 ....wd.find_element(By.ID,username).send_keys(byhy)wd.find_element(By.CLASS_NAME,password).send_keys(sdfsdf)wd.find_element(By.TAG_NAME,input).send_keys(sdfsdf)wd.find_element(By.CSS_SELECTOR,button[typesubmit]).click()1、根据 id属性 选择元素。示例网址https://www.byhy.net/cdn2/files/selenium/stock1.html示例代码fromseleniumimportwebdriver# 从库中导入相应的包fromselenium.webdriver.common.byimportBy# 导入bywebdriverwebdriver.Edge()# 创建浏览器驱动对象webdriver.get(https://www.byhy.net/cdn2/files/selenium/stock1.html)# 浏览器驱动打开网页webdriver.find_element(By.ID,kw).send_keys(股份\n)# 定位股份名称输入框输入股份二字回车webdriver.find_element(By.ID,suggestion).send_keys(666)# 定位建议输入框输入666webdriver.find_element(By.ID,submit-suggestion).click()# 定位提交按钮点击提交input()效果图2、根据 class属性 选择元素示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码 通过class属性 来定位元素 fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy webdriverwebdriver.Edge()# 创建浏览器驱动webdriver.get(https://www.byhy.net/cdn2/files/selenium/sample1.html)# 打开相应的网址elementswebdriver.find_elements(By.CLASS_NAME,plant)# 通过class属性定位植物elements1webdriver.find_elements(By.CLASS_NAME,animal)# 通过class属性定位所有的动物forelementinelements:# 以下都是循环输入文本内容print(element.text)print()forelement1inelements1:print(element1.text)注意1、find_elements返回的是找到的符合条件的 所有 元素 (这里有3个元素) 放在一个 列表 中返回。2、而如果我们使用webdriver.find_element(注意少了一个s) 方法 就只会返回 第一个 元素。多个class类型的使用学生张三 可以定义有 多个 类型 中国人 和 学生 中国人 和 学生 都是 张三 的 类型。元素也可以有 多个class类型 多个class类型的值之间用 空格 隔开比如span classchinese student张三/span注意这里 span元素 有两个class属性分别 是 chinese 和 student 而不是一个 名为 chinese student 的属性。我们要用代码选择这个元素可以指定任意一个class 属性值都可以选择到这个元素如下elementwd.find_elements(By.CLASS_NAME,chinese)或者elementwd.find_elements(By.CLASS_NAME,student)而不能这样写elementwd.find_elements(By.CLASS_NAME,chinese student)3、根据 tag名 选择元素示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy webdriverwebdriver.Edge()webdriver.get(https://www.byhy.net/cdn2/files/selenium/sample1.html)elementswebdriver.find_elements(By.TAG_NAME,span)elements1webdriver.find_elements(By.TAG_NAME,div)forelementinelements:print(element.text)print(-------)forelement1inelements1:print(element1.text)find_element 和 find_elements 的区别使用 find_elements 选择的是符合条件的 所有 元素 如果没有符合条件的元素 返回空列表。使用 find_element 选择的是符合条件的 第一个 元素 如果没有符合条件的元素 抛出 NoSuchElementException 异常。五、等待界面元素出现在我们进行网页操作的时候 有的元素内容不是可以立即出现的 可能会等待一段时间。Selenium提供了一个更合理的解决方案是这样的当发现元素没有找到的时候 并不立即返回 找不到元素的错误。而是周期性每隔半秒钟重新寻找该元素直到该元素找到或者超出指定最大等待时长这时才 抛出异常如果是 find_elements 之类的方法 则是返回空列表。Selenium 的 Webdriver 对象 有个方法叫 implicitly_wait 可以称之为隐式等待或者全局等待。该方法接受一个参数 用来指定 最大等待时长。如果我们 加入如下代码webdriver.implicitly_wait(10)那么后续所有的find_element或者find_elements之类的方法调用 都会采用上面的策略如果找不到元素 每隔半秒钟再去界面上查看一次 直到找到该元素 或者 过了10秒 最大时长。示例网址https://www.byhy.net/cdn2/files/selenium/stock1.html示例代码fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy webdriverwebdriver.Edge()webdriver.implicitly_wait(10)webdriver.get(https://www.byhy.net/cdn2/files/selenium/stock1.html)webdriver.find_element(By.ID,kw).send_keys(国投\n)elementwebdriver.find_element(By.ID,1)print(element.text)webdriver.quit()六、操控元素操控元素通常包含点击元素在元素中输入字符串获取元素包含的信息比如文本内容元素的属性。1、点击元素当我们调用webElement对象的click方法去点击元素的时候浏览器接收到自动化命令点击的是该元素的中心点位置。2、输入框输入字符串也非常简单就是调用元素webElement对象的send_keys方法。如果我们要 把输入框中已经有的内容清除掉可以使用WebElement对象的clear方法。示例网址https://www.byhy.net/cdn2/files/selenium/test3.html示例代码elementwd.find_element(By.ID,input1)element.clear()# 清除输入框已有的字符串element.send_keys(白月黑羽)# 输入新字符串3、获取元素文本信息1通过WebElement对象的 text 属性可以获取元素展示在界面上的文本内容。elementwd.find_element(By.ID,animal)print(element.text)补充通过WebElement对象的 text 属性可以获取元素展示在界面上的文本内容。但是有时候元素的文本内容没有展示在界面上或者没有完全完全展示在界面上。 这时用WebElement对象的text属性获取文本内容就会有问题。出现这种情况可以尝试使用element.get_attribute(innerText)或者element.get_attribute(textContent)使用 innerText 和 textContent 的区别是前者只显示元素可见文本内容后者显示所有内容包括display属性为none的部分2获取元素属性通过WebElement对象的 get_attribute 方法来获取元素的属性值比如要获取元素属性class的值就可以使用element.get_attribute(class)示例网址https://www.byhy.net/cdn2/files/selenium/stock1.html示例代码fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy# 获取元素属性webdriverwebdriver.Edge()webdriver.get(https://www.byhy.net/cdn2/files/selenium/stock1.html)elementwebdriver.find_element(By.ID,1)print(element.get_attribute(class))# 打印出来的是result-itemelement1webdriver.find_element(By.ID,suggestion)print(element1.get_attribute(placeholder))# 打印出来的是一句话建议3获取整个元素对应的HTML要获取整个元素对应的HTML文本内容可以使用element.get_attribute(outerHTML)如果只是想获取某个元素内部的HTML文本内容可以使用element.get_attribute(innerHTML)示例网址https://www.byhy.net/cdn2/files/selenium/stock1.html示例代码4获取输入框里面的文字对于input输入框的元素要获取里面的输入文本用text属性是不行的这时可以使用element.get_attribute(value)示例网址https://www.byhy.net/cdn2/files/selenium/stock1.html示例代码fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy# 获取输入框的值webdriverwebdriver.Edge()webdriver.get(https://www.byhy.net/cdn2/files/selenium/stock1.html)elementwebdriver.find_element(By.ID,kw)element.send_keys(四川路桥)print(element.get_attribute(value))七、CSS表达式选择元素通过 CSS Selector 选择单个元素的方法是find_element(By.CSS_SELECTOR,CSS Selector参数)选择所有元素的方法是find_elements(By.CSS_SELECTOR,CSS Selector参数)1根据class属性选择元素的语法是在class值前面加上一个点.class值示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码2根据id属性 选择元素的语法是在id号前面加上一个井号#id值示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码3选择 子元素 和 后代元素如果 元素2 是 元素1 的 直接子元素 CSS Selector 选择子元素的语法是这样的元素1元素2中间用一个大于号 我们可以理解为箭头号注意最终选择的元素是 元素2 并且要求这个 元素2 是 元素1 的直接子元素示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码如果 元素2 是 元素1 的 后代元素 CSS Selector 选择后代元素的语法是这样的元素1元素2中间是一个或者多个空格隔开最终选择的元素是 元素2 并且要求这个 元素2 是 元素1 的后代元素。示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码4根据属性选择id、class 都是web元素的 属性 因为它们是很常用的属性所以css选择器专门提供了根据 id、class 选择的语法。那么其他的属性呢css 选择器支持通过任何属性来选择元素语法是用一个方括号 [] 。示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码fromseleniumimportwebdriverfromselenium.webdriver.common.byimportBy webdriverwebdriver.Edge()webdriver.get(https://www.byhy.net/cdn2/files/selenium/sample1.html)elementwebdriver.find_element(By.CSS_SELECTOR,.footer2 [href])print(element.get_attribute(outerHTML))CSS 还可以选择 属性值包含 某个字符串的元素比如 要选择a节点里面的href属性包含了 miitbeian 字符串就可以这样写:a[href*miitbeian]还可以 选择 属性值以某个字符串 开头的元素比如 要选择a节点里面的href属性 以 http 开头就可以这样写:a[href^http]还可以 选择 属性值以某个字符串 结尾的元素比如 要选择a节点里面的href属性以 gov.cn 结尾就可以这样写 :a[href$gov.cn]如果一个元素具有多个属性div classmisc ctypegun沙漠之鹰/divCSS 选择器 可以指定 选择的元素要 同时具有多个属性的限制像这样div[classmisc][ctypegun]八、选择语法联合使用CSS selector的另一个强大之处在于 选择语法 可以联合使用示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码九、组选择如果我们要同时选择所有的class为plant和class为animal的元素。怎么定位?这种情况css选择器可以使用逗号称之为 组选择器像这样.plant,.animal示例网址https://www.byhy.net/cdn2/files/selenium/sample1.html示例代码再比如我们要同时选择所有tag名为div的元素 和 id为BYHY的元素就可以像这样写div,#BYHY十、按次序选择子节点1父元素的第n个子节点我们可以指定选择的元素是父元素的第几个子节点使用nth-child示例网址[https://www.byhy.net/cdn2/files/selenium/sample1b.html](https://www.byhy.net/cdn2/files/selenium/sample 1b.html)示例代码选择第二个子元素并且是span类型如果你不加节点类型限制直接这样写:nth-child(2)就是选择所有位置为第2个的所有元素不管是什么类型。2父元素的倒数第n个子节点也可以说选择的是父元素的倒数第几个子节点使用nth-last-child比如p:nth-last-child(1)# 就是选择第倒数第1个子元素并且是p元素。示例网址https://www.byhy.net/cdn2/files/selenium/sample1b.html示例代码3父元素的第几个某类型的子节点我们可以指定选择的元素 是父元素的第几个某类型的子节点使用nth-of-type比如我们要选择 唐诗 和宋词 的第一个 作者选择的是 第1个span类型 的子元素所以也可以这样写span:nth-of-type(1)示例网址https://www.byhy.net/cdn2/files/selenium/sample1b.html示例代码4父元素的倒数第几个某类型的子节点选择父元素的倒数第几个某类型的子节点使用nth-last-of-type像这样p:nth-last-of-type(2)示例网址https://www.byhy.net/cdn2/files/selenium/sample1b.html示例代码(5)奇数节点和偶数节点如果要选择的是父元素的偶数节点使用nth-child(even)比如p:nth-child(even)如果要选择的是父元素的奇数节点使用nth-child(odd)p:nth-child(odd)示例网址https://www.byhy.net/cdn2/files/selenium/sample1b.html示例代码十一、兄弟节点选择1相邻兄弟节点选择我们要选择 唐诗 和宋词 的第一个 作者还有一种思考方法就是选择 h3 后面紧跟着的兄弟节点 span。这就是一种 相邻兄弟 关系可以这样写h3 span表示元素 紧跟关系的 是加号示例网址https://www.byhy.net/cdn2/files/selenium/sample1b.html示例代码2后续所有兄弟节点选择如果要选择是 选择 h3 后面所有的兄弟节点 span可以这样写h3 ~ span示例网址https://www.byhy.net/cdn2/files/selenium/sample1b.html示例代码