selenium
一、WEB自动化简介
适合做自动化的项目:(1)软件需求变更不频繁(2)项目周期比较长(3)自动化的脚本能够重复利用。
自动化测试入项:系统测试
自动化测试实现过程:可行性分析,框架的选择(selenium,RF),需求分析、计划、测试用例的设计,无人值守、提交报告。
二、selenium的原理与安装
2.1 selenium简介
Selenium是一套Web网站的程序自动化的解决方案。通过它我们可以写出自动化程序,像人在浏览器中操作web页面一样。比如点击页面按钮,在文本框中输入文字等操作。而且还能从web页面获取信息。比如获取火车、汽车票务信息,招聘网站职位岗位,财经网站股票价格信息等,然后用程序进行分析处理。
Selenium的自动化原理:
2.2 自动化环境安装
安装selenium
Selenium客户端安装命令行:
1 | pip install selenium |
如果安装不了可以执行清华大学的源
1 | pip install selenium - i https: / / pypi.tuna.tsinghua.edu.cn / simple |
安装chromedriver
google源
http://chromedriver.storage.googleapis.com/index.html
Chrome浏览器
安装Chrome浏览器驱动的网址
https://googlechromelabs.github.io/chrome-for-testing/
选择114 win64版本与浏览器版本适配的webdriver
https://registry.npmmirror.com/binary.html?path=chrome-for-testing/
看浏览器的版本
选择大版本相同的驱动进行下载
下载后解压
2.3 简单示例
写selenium程序查看chromedriver驱动启动
selenium_test1.py
1 2 3 4 5 | from selenium import webdriver from selenium.webdriver.chrome.service import Service wd = webdriver.Chrome(service = Service(r "C:\Users\Downloads\chromedriver_win32\chromedriver.exe" )) input () |
运行程序
可以看到服务中已经启动了chromedriver驱动
Selenium简单示例,用chrome浏览器打开https://www.baidu.com
1 2 3 4 5 6 | from selenium import webdriver from selenium.webdriver.chrome.service import Service wd = webdriver.Chrome(service = Service(r "C:\Users\Downloads\chromedriver_win32\chromedriver.exe" )) wd.get( 'https://www.baidu.com' ) input () |
关闭chromedriver日志
1 2 3 4 5 6 7 8 9 10 | from selenium import webdriver from selenium.webdriver.chrome.service import Service options = webdriver.ChromeOptions() options.add_experimental_option( 'excludeSwitches' ,[ 'enable-logging' ] ) wd = webdriver.Chrome(options = options,service = Service(r "C:\Users\Downloads\chromedriver_win32\chromedriver.exe" )) wd.get( 'https://www.baidu.com' ) input () |
三、选择元素的基本方法
面试题:如果元素定位不到,如何分析
1、元素没有完成加载2、Frame中
3、元素不可用、不可读、不可见
4、动态属性,动态的DIV层
对于百度搜索页面,如果我们想自动化输入柏悦黑羽,就是在网页中,操控界面元素。Web界面自动化,要操纵元素,首先需要选择界面元素,或者说定位界面元素。就是先告诉浏览器,你要操作哪个界面元素,让它找到你要操作的界面元素。我们必须要先让浏览器先找到元素,然后才能操作元素。
八大元素定位:id、name、class_name、xpath、css、tag_name、link_text、partial_link_text
3.1 根据ID属性选择元素
我们可以把id想象成元素的编号,是用来在html中标记元素的。根据规范,如果元素有id属性,这个id必须是当前html中唯一的。所以,如果元素有id,这个id必须是当前html中唯一的,所以如果元素有id,根据id选择元素是最简单高效的方式。
访问百度,并搜索通讯相关消息
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome() #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 element = wd.find_element(By. ID , 'kw' ) # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 element.send_keys( "通讯\n" ) pass |
这里返回的是一个WebElement对象
如果根据传入的ID,找不到这样的元素,find_element方法就会抛出selenium.common.exceptions.NoSuchElementException异常。
更改程序传入一个不存在的id
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome() #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 element = wd.find_element(By. ID , 'kw1' ) # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 element.send_keys( "通讯\n" ) pass |
使用点击搜索
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from selenium import webdriver from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome() #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By. ID , 'kw' ) # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 element1.send_keys( "通讯\n" ) element2 = wd.find_element(By. ID , 'su' ) element2.click() wd.quit() |
3.2 根据name属性选择元素
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\python projects\python_001\python_001\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 element = wd.find_element(By.NAME, 'wd' ) # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 element.send_keys( "通讯\n" ) pass |
3.3 根据class属性选择元素
Web自动化的难点和重点之一,就是如何选择我们想要操作的web页面元素。除了根据元素的id,我们还可以根据元素的class属性选择元素。
如果想选择指定class属性的元素可以使用find_elements
新建项目
新建1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > </ head > < body > < div class="plant">< span >土豆</ span ></ div > < div class="plant">< span >洋葱</ span ></ div > < div class="plant">< span >白菜</ span ></ div > < div class="animal">< span >狮子</ span ></ div > < div class="animal">< span >老虎</ span ></ div > < div class="animal">< span >山羊</ span ></ div > </ body > </ html > |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CLASS_NAME, 'plant' ) elements2 = wd.find_elements(By.CLASS_NAME, 'animal' ) # elements1=wd.find_elements_class_name('plant') # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 for elements in elements1: print (elements.text) for elements in elements2: print (elements.text) pass |
输出结果:
如果通过class name获取单个webElement对象
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_element(By.CLASS_NAME, 'plant' ) elements2 = wd.find_element(By.CLASS_NAME, 'animal' ) # elements1=wd.find_elements_class_name('plant') # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 print (elements1.text) print (elements2.text) pass |
输出结果:
find_element和find_elements的区别
使用find_elements选择的是符合条件的所有元素,如果没有符合条件的元素,返回空列表
使用find_element选择的是符合条件的第一个元素,如果没有符合条件的元素,抛出异常。
查找没有符合条件的元素
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_element(By.CLASS_NAME, 'plant1' ) # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 print (elements1.text) pass |
会产生如下错误:
3.4 根据tag名选择元素
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.TAG_NAME, 'div' ) # 通过该webElement对象,就可以对页面元素进行操作了 # 比如输入字符串 for elements in elements1: print (elements.text) pass |
运行结果如下:
3.5 根据link_text链接文本定位
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from time import sleep from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\python projects\python_001\python_001\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 element = wd.find_element(By.LINK_TEXT, '新闻' ) element.click() sleep( 100 ) pass |
3.6 根据PARTIAL_LINK_TEXT选择元素
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from time import sleep from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\python projects\python_001\python_001\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 element = wd.find_element(By.PARTIAL_LINK_TEXT, '新' ) element.click() sleep( 100 ) pass |
3.6 通过WebElement对象选择元素
不仅WebDriver对象有选择元素的方法,WebElement对象也有选择元素的方法。WebElement对象也可以调用find_elements_by_xxx、find_element_by_xxx之类的方法。
WebDriver对象选择元素范围是整个Web页面,而WebElement对象选择的范围是该元素的内部。
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > </ head > < body > < div class="plant">< span >土豆</ span ></ div > < div class="plant">< span >洋葱</ span ></ div > < div class="plant">< span >白菜</ span ></ div > < div class="animal">< span >狮子</ span ></ div > < div class="animal">< span >老虎</ span ></ div > < div class="animal">< span >山羊</ span ></ div > < div id="container"> < div id="layer1"> < div id="inner11">< span >内层11</ span ></ div > < div id="inner12">< span >内层12</ span ></ div > </ div > < div id="layer2"> < div id="inner21">< span >内层21</ span ></ div > < div id="inner22">< span >内层22</ span ></ div > </ div > </ div > </ body > </ html > |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) #根据id选择元素,返回的就是该元素对应的webElement对象。 element = wd.find_element(By. ID , 'container' ) # 限制 选择元素的范围是id 为container 内部的内容 spans = element.find_elements(By.TAG_NAME, "span" ) # 比如输入字符串 for span in spans: print (span.text) pass |
3.7 等待元素出现
当发现元素没有找到的时候,并不立即返回元素找不到的错误。而是周期性的(每隔半秒钟)重新寻找该元素,直到元素被找到,或者超出指定最大等待时长,这才抛出异常(如果是find_elements之类的方法,则是返回空列表)。
Selenium的Webdriver对象中有个方法叫做implicitly_wait,该方法接收一个参数,用来指定最大等待时长。加入后后续的所有find_element或者find_elements之类的方法调用都会采用上面的策略。如果找不到元素每隔半秒再去界面上查看一次,直到找到了该元素,或者过了10S最大时长。
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) # 设置等待时长 wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element = wd.find_element(By. ID , 'container' ) # 限制 选择元素的范围是id 为container 内部的内容 spans = element.find_elements(By.TAG_NAME, "span" ) # 比如输入字符串 for span in spans: print (span.text) pass |
四、操控元素的基本方法
选择到元素之后,我们的代码会返回元素对应的WebElement对象,通过这个对象,我们就可以操控元素。
操控元素通常包括:
1、 点击元素
2、 在元素中输入字符串,通常是对输入框这样的元素
3、 获取元素包含的信息,比如文本内容,元素的属性
4.1 点击元素
点击元素非常简单,就是调用元素WebElement对象的click方法。当我们调用WebElement对象的click方法去点击元素的时候,浏览器接收到自动化命令,点击的是该元素的中心点位置。
输入框
输入字符串也非常简单,就是调用WebElement对象的send_keys方法。
如果我们要把输入框已经有的内容清除掉,可以使用WebElement对象的clear方法
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) # 设置等待时长 wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By. ID , 'kw' ) element2 = wd.find_element(By. ID , 'su' ) # 先清除搜索框内容,然后输入海贼王 element1.clear() element1.send_keys( "海贼王" ) element2.click() pass |
4.2 获取元素信息
获取元素的文本内容,通过WebElement对象的text属性,可以获取元素展示在界面上的文本内容。
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) # 设置等待时长 wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CLASS_NAME, 'animal' ) # 获取文本内容 print (element1.text) pass |
运行结果如下:
4.3 获取元素属性
通过WebElement对象的get_attribute方法来获取元素的属性值。比如要获取元素属性class的值,就可以使用element.get_attribute("class")
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By #创建webDriver对象 wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) # 设置等待时长 wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By. ID , 'kw' ) # 获取属性值 print (element1.get_attribute( "maxlength" )) pass |
运行结果如下:
执行完自动化代码,如果想要关闭浏览器窗口可以调用WebDriver对象的quit方法。
1 | wd.quit() |
4.4 获取元素对应的HTML
要获取整个元素对应的HTML文本内容,可以使用element.get_attribute(“outerHTML”)
如果只是想获取某个元素内部的HTML文本内容,可以使用element.get_attribute(“innerHTML”)
获取整段的HTML代码,使用outerHTML
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) # 设置等待时长 wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By. ID , 'kw' ) # 获取属性值 print (element1.get_attribute( "outerHTML" )) wd.quit() pass |
运行结果:
获取内部HTML,使用innerHTML
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) # 设置等待时长 wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CLASS_NAME, 's_btn_wr' ) # 获取属性值 print (element1.get_attribute( "innerHTML" )) wd.quit() pass |
运行结果:
4.5 获取输入框中的内容
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "https://www.baidu.com" ) # 设置等待时长 wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By. ID , 'kw' ) element1.send_keys( "海贼王" ) # 获取属性值 print (element1.get_attribute( "value" )) wd.quit() pass |
输出结果:
通过WebElement对象的text属性,可以获取元素展示在界面上的文本内容。但是有时候,元素的文本内容没有展示在界面上,或者没有完全展示在界面上。这时,用WebElement对象的text属性获取文本内容会有问题。出现这种情况,可以尝试使用element.get_attribute(‘innerText’)或者element.get_attribute(‘textContent’)
五、CSS选择器
如果我们选择的元素没有id、class属性,或者我们不想选择的元素也有相同的id、class属性值,我们通常可以使用CSS selector语法选择元素。HTML中经常为某种元素指定显示效果,CSS必须告诉浏览器,要选择哪些元素,来使用这样的显示风格。CSS selector语法就是用来选择元素的。
通过CSS Selector选择单个元素的方法是
1 | find_element_by_css_selector(CSS Selector参数) |
选择所有元素的方法是
1 | find_elements_by_css_selector(CSS Selector参数) |
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>Title< / title> <style> .animal{color: red} < / style> < / head> <body> <div class = "plant" ><span>土豆< / span>< / div> <div class = "plant" ><span>洋葱< / span>< / div> <div class = "plant" ><span>白菜< / span>< / div> <div class = "animal" ><span>狮子< / span>< / div> <div class = "animal" ><span>老虎< / span>< / div> <div class = "animal" ><span>山羊< / span>< / div> <div id = "container" > <div id = "layer1" > <div id = "inner11" ><span>内层 11 < / span>< / div> <div id = "inner12" ><span>内层 12 < / span>< / div> < / div> <div id = "layer2" > <div id = "inner21" ><span>内层 21 < / span>< / div> <div id = "inner22" ><span>内层 22 < / span>< / div> < / div> < / div> < / body> < / html> |
selenium_test1.p
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, ".animal" ) # 获取文本内容 print (element1.get_attribute( "innerHTML" )) pass |
输出结果如下:
5.1 根据tag名、id、class选择元素
CSS Selector同样可以根据tag名、id属性、class属性来选择元素。根据tag名选择元素的CSS Selector语法非常简单,直接写上tag名即可。
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "span" ) # 获取文本内容 print (element1.get_attribute( "innerHTML" )) pass |
输出结果:
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 3 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_elements(By.CSS_SELECTOR, "span" ) # 获取文本内容 for element in element1: print (element.get_attribute( "innerHTML" )) pass |
运行结果:
根据id属性选择元素的语法是在id号前面加上一个#号
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 3 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "#container" ) # 获取文本内容 print (element1.get_attribute( "innerHTML" )) pass |
运行结果:
5.2 选择子元素和后代元素
HTML中,元素内部可以包含其他元素,比如下面的HTML片段
1 2 3 4 5 6 7 8 9 10 | <div id = "container" > <div id = "layer1" > <div id = "inner11" ><span>内层 11 < / span>< / div> <div id = "inner12" ><span>内层 12 < / span>< / div> < / div> <div id = "layer2" > <div id = "inner21" ><span>内层 21 < / span>< / div> <div id = "inner22" ><span>内层 22 < / span>< / div> < / div> < / div> |
后代元素也包括了直接子元素,比如id为layer1和layer2的两个div元素,也可以说是id为container的div元素的直接子元素,同时也是后代子元素。
如果元素2是元素1的直接子元素,CSS Selector选择子元素的语法是这样的:
1 | 元素 1 > 元素 2 |
中间使用>号,最终选择的元素是元素2,并且要求这个元素2是元素1的直接子元素
也支持更多层级的选择
1 | 元素 1 >元素 2 >元素 3 >元素 4 |
就是选择元素1里面的子元素元素2里面的子元素元素3里面的子元素元素4
如果元素2是元素1的后代元素,CSS Selector选择后代元素的语法是这样的:
1 | 元素 1 元素 2 |
最终选择的元素是元素2,并且要求这个元素2是元素1的后代元素。
也支持更多的层级的选择
1 | 元素 1 元素 2 元素 3 元素 4 |
最终选择的元素是元素4
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > < style > #container>div {color: red} </ style > </ head > < body > < div class="plant">< span >土豆</ span ></ div > < div class="plant">< span >洋葱</ span ></ div > < div class="plant">< span >白菜</ span ></ div > < div class="animal">< span >狮子</ span ></ div > < div class="animal">< span >老虎</ span ></ div > < div class="animal">< span >山羊</ span ></ div > < div id="container"> < div id="layer1"> < div id="inner11">< span >内层11</ span ></ div > < div id="inner12">< span >内层12</ span ></ div > </ div > < div id="layer2"> < div id="inner21">< span >内层21</ span ></ div > < div id="inner22">< span >内层22</ span ></ div > </ div > </ div > </ body > </ html > |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 3 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "#container>div" ) # 获取文本内容 print (element1.get_attribute( "innerHTML" )) pass |
运行结果:
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 3 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "#container div" ) # 获取文本内容 print (element1.get_attribute( "innerHTML" )) pass |
运行结果:
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "#container>span" ) # 获取文本内容 print (element1.get_attribute( 'outerHTML' )) wd.quit() |
运行结果:由于span不是container的直接子元素,所以找不到span
更改Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "#container span" ) # 获取文本内容 print (element1.get_attribute( 'outerHTML' )) wd.quit() |
运行结果:
这时候可以找到它的后代元素。
5.3 根据属性选择
CSS选择器支持通过任何属性来选择元素,语法是用一个方括号[]。比如需要选择<a href=”https://www.baidu.com”>百度</a>里面根据href选择,可以使用[href=”https://www.baidu.com”]。这个表达式的意思是,选择属性href值为https://www.baidu.com的元素。
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > < style > #container>div {color: red} </ style > </ head > < body > < a href="https://www.baidu.com">baidu</ a > </ body > </ html > |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_element(By.CSS_SELECTOR, "[href='https://www.baidu.com']" ) # 获取文本内容 print (elements1.get_attribute( 'innerHTML' )) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements2 = wd.find_elements(By.CSS_SELECTOR, "div[class='animal']" ) # 获取文本内容 for element2 in elements2: print (element2.get_attribute( 'innerHTML' )) wd.quit() |
运行结果:
5.4 选择语法联合使用
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>Title< / title> <style> #container>div {color: red} < / style> < / head> <body> <a href = "https://www.baidu.com" >baidu< / a> <div class = "plant" ><span>土豆< / span>< / div> <div class = "plant" ><span>洋葱< / span>< / div> <div class = "plant" ><span>白菜< / span>< / div> <div class = "animal" ><span>狮子< / span>< / div> <div class = "animal" ><span>老虎< / span>< / div> <div class = "animal" ><span>山羊< / span>< / div> <div id = "container" > <div id = "layer1" > <div class = "inner11" ><span>内层 11 < / span>< / div> <div class = "inner12" ><span>内层 12 < / span>< / div> < / div> <div id = "layer2" > <div class = "inner21" ><span>内层 21 < / span>< / div> <div class = "inner22" ><span>内层 22 < / span>< / div> < / div> < / div> < / body> < / html> |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "div > #layer1 .inner11" ) # 获取文本内容 print (element1.get_attribute( 'innerHTML' )) wd.quit() |
如果想同时选择属性不同的多个不同元素,可以用,连接不同的属性值
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > < style > #container>div {color: red} </ style > </ head > < body > < a href="https://www.baidu.com">baidu</ a > < div class="plant">< span >土豆</ span ></ div > < div class="plant">< span >洋葱</ span ></ div > < div class="plant">< span >白菜</ span ></ div > < div class="animal">< span >狮子</ span ></ div > < div class="animal">< span >老虎</ span ></ div > < div class="animal">< span >山羊</ span ></ div > < div id="container"> < div id="layer1"> < div class="inner11">< span >内层11</ span ></ div > < div class="inner12">< span >内层12</ span ></ div > </ div > < div id="layer2"> < div class="inner21">< span >内层21</ span ></ div > < div class="inner22">< span >内层22</ span ></ div > </ div > </ div > </ body > </ html > |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, ".plant,.animal" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果如下:
5.5 选择语法组选择
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > </ head > < body > < div id="t1"> < h3 >唐诗</ h3 > < span >李白</ span > < p >静夜思</ p > < span >杜甫</ span > < p >春夜喜雨</ p > </ div > </ body > </ html > |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#t1 p,#t1 span" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果为:
5.6 按次序选择子节点
按次序选择子节点,父元素的第n个子节点。我们可以指定选择的元素是父元素的第几个子节点,使用nth-child
1 | span:nth - child( 2 ) |
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >Title</ title > </ head > < body > < div id="t1"> < h3 >唐诗</ h3 > < span >李白</ span > < p >静夜思</ p > < span >杜甫</ span > < p >春夜喜雨</ p > </ div > < div id="t2"> < h3 >宋词</ h3 > < span >苏轼</ span > < p >赤壁怀古</ p > < p >明月几时有</ p > < p >江城子.乙卯正月二十夜记梦</ p > </ div > </ body > </ html > |
我们要选择唐诗宋词的第一个作者,也就是第二个子元素。
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "span:nth-child(2)" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果为:
父节点的倒数第n个子节点。也可以反过来,选择的是父元素的倒数第几个子节点,使用nth-last-child
1 | p:nth - last - child( 1 ) |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "p:nth-last-child(1)" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
输出结果如下:
父元素的第几个某类型的子节点。我们可以指定选择的元素是父元素的第几个某类型的子节点,使用nth-of-type。
比如,我们要选择唐诗和宋词的第一个作者,可以选择的是第2个子元素,并且是span类型。
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "span:nth-of-type(1)" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果:
5.7 奇数节点和偶数节点
如果要选择的是父元素的奇数节点,使用nth-child(odd)
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#t1 :nth-child(odd)" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
输出结果:
如果要选择的是父元素的偶数节点,使用nth-child(even)
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#t1 :nth-child(even)" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
输出结果:
输出指定类型的奇数节点
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#t1 p:nth-of-type(even)" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
输出结果:
5.8 兄弟节点选择语法
相邻兄弟节点选择。选择唐诗和宋词的第一个作者可以选择h3后面紧跟的兄弟节点span,这就是一种相邻兄弟关系,可以这样写h3+span,表示元素紧跟关系的是加号
1 | h3 + span |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "h3+span" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
输出结果:
如果选择h3后面所有的兄弟节点,使用~
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "h3~span" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果:
如果指定某个div
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#t1 h3~span" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果:
六、Frame 切换/窗口切换
6.1 frame切换
如果使用iframe元素,在其中一个html文档中包含另外的html文档,就得使用Frame切换。这个iframe元素很特殊,在html语法中,frame元素或者iframe元素的内容部会包含一个被嵌入的另一份html文档。
在我们使用selenium打开一个网页是我们的操作范围缺省是当前的html,并不包含嵌入的html文件的内容。如果我们要操作被嵌入的html文档中的元素,就必须切换操作方位到被嵌入的文档中。使用WebDriver对象的switch_to属性。
1 | wd.switch_to.frame(frame_reference) |
1.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>Title< / title> < / head> <body> <div id = "t1" > <h3>唐诗< / h3> <span>李白< / span> <p>静夜思< / p> <span>杜甫< / span> <p>春夜喜雨< / p> < / div> <div id = "t2" > <h3>宋词< / h3> <span>苏轼< / span> <p>赤壁怀古< / p> <p>明月几时有< / p> <p>江城子.乙卯正月二十夜记梦< / p> < / div> <iframe src = "2.html" id = "frame1" name = "innerFrame" > < / iframe> < / body> < / html> |
2.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>Title< / title> <style> #container>div {color: red} < / style> < / head> <body> <a href = "https://www.baidu.com" >baidu< / a> <div class = "plant" ><span>土豆< / span>< / div> <div class = "plant" ><span>洋葱< / span>< / div> <div class = "plant" ><span>白菜< / span>< / div> <div class = "animal" ><span>狮子< / span>< / div> <div class = "animal" ><span>老虎< / span>< / div> <div class = "animal" ><span>山羊< / span>< / div> <div id = "container" > <div id = "layer1" > <div class = "inner11" ><span>内层 11 < / span>< / div> <div class = "inner12" ><span>内层 12 < / span>< / div> < / div> <div id = "layer2" > <div class = "inner21" ><span>内层 21 < / span>< / div> <div class = "inner22" ><span>内层 22 < / span>< / div> < / div> < / div> < / body> < / html> |
其中,frame_reference可以是frame元素的属性name或者ID
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) wd.switch_to.frame( "frame1" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#container" ) # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果:
也可以填写frame所对应的WebElement对象。我们可以根据frame的元素位置或者属性特性,使用find系列的方法,选择到该元素,得到对应的WebElement对象。
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) wd.switch_to.frame(wd.find_element(By.CSS_SELECTOR, '[src="2.html"]' )) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#container" ) # elements1=wd.find_elements(By.CSS_SELECTOR,".plant") # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.quit() |
运行结果:
如果已经切入了内部的iframe框架,想要切回原来的html中,可以通过如下代码:
1 | wd.switch_to.default_content() |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 10 ) wd.switch_to.frame(wd.find_element(By.CSS_SELECTOR, '[src="2.html"]' )) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#container" ) # elements1=wd.find_elements(By.CSS_SELECTOR,".plant") # 获取文本内容 for element1 in elements1: print (element1.get_attribute( 'innerHTML' )) wd.switch_to.default_content() element2 = wd.find_element(By.CSS_SELECTOR, "#t1" ) print (element2.text) wd.quit() |
运行结果:
6.2 切换到新的窗口
在网页上操作的时候,我们经常遇到,点击一个链接或者按钮,就会打开一个新窗口。如果我们要到新窗口操作,可以使用Webdriver对象的switch_to属性的window方法
1 | wd.switch_to.window(handle) |
参数handle需要传入什么参数,WebDriver对象有window_handles属性,这是一个列表对象,里面包括了当前浏览器里面所有的窗口句柄。句柄就是对应网页窗口的一个ID。
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) wd.implicitly_wait( 30 ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "[href='https://www.baidu.com']" ) element1.click() for handle in wd.window_handles: wd.switch_to.window(handle) if '百度' in wd.title: wd.find_element(By. ID , "kw" ).send_keys( '截拳道' ) element2 = wd.find_element(By. ID , 'su' ) element2.click() break wd.quit() |
上面代码的用意就是,依次获取wd.window_handles里面的所有句柄对象,并且调用wd.switch_to.window(handle)方法,切入到每个窗口。然后检查里面该窗口对象的属性(可以是标题栏、地址栏),判断是不是我们要操作的那个窗口,如果是,就跳出循环。
如果我们在新窗口操作结束后,还要回到原来的窗口,我们仍然可以使用上面的方法,依次切入窗口,然后根据标题栏之类的属性进行判断。
或者
因为我们一开始就在原来的窗口里面,我们知道进入新窗口操作完后,还需要再切回来,可以事先保存该老窗口的句柄,使用下面的方法
1 2 | #mainWindow变量保存当前窗口的句柄 mainWindow = wd.current_window_handle |
切换到新窗口操作完后,可以直接将driver对应的对象返回原来的窗口
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 | from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/1.html" ) mainWindow = wd.current_window_handle # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "[href='https://www.baidu.com']" ) element1.click() time.sleep( 3 ) for handle in wd.window_handles: wd.switch_to.window(handle) time.sleep( 3 ) if '百度' in wd.title: break wd.find_element(By. ID , "kw" ).send_keys( '截拳道' ) time.sleep( 3 ) wd.switch_to.window(mainWindow) time.sleep( 3 ) wd.find_element(By. ID , 'clickme' ).click() |
七、输入框和选择框
选择框
radio框
radio框,直接使用WebElement的click方法,模拟用户点击就可以了。
3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>选择框< / title> < / head> <body> <div id = "s_radio" > < input type = "radio" name = "teacher" value = "小江老师" >小江老师 <br> < input type = "radio" name = "teacher" value = "小雷老师" >小雷老师 <br> < input type = "radio" name = "teacher" value = "小凯老师" checked = "checked" >小凯老师 < / div> < / body> < / html> |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "#s_radio input[checked=checked]" ) print ( "当前选中的是:" + element1.get_attribute( 'value' )) time.sleep( 10 ) element2 = wd.find_element(By.CSS_SELECTOR, "#s_radio input[value='小雷老师']" ) element2.click() time.sleep( 10 ) print ( "当前选中的是:" + element2.get_attribute( 'value' )) |
checkbox框
对checkbox进行选择,也是直接用WebElement的click方法,模拟用户点击选择。需要注意的是,要选中checkbox的一个选项,必须先获取当前该复选框的状态,如果该选项已经勾选了,就不能够点击,否则反而会取消选择。先把已经选中的选项全部点击一下,确保都是未选择状态。再选择需要选择的。
3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>选择框< / title> < / head> <body> <div id = "s_checkbox" > < input type = "checkbox" name = "teacher" value = "小江老师" >小江老师 <br> < input type = "checkbox" name = "teacher" value = "小雷老师" >小雷老师 <br> < input type = "checkbox" name = "teacher" value = "小凯老师" checked = "checked" >小凯老师 < / div> < / body> < / html> |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, "#s_checkbox input[checked=checked]" ) time.sleep( 10 ) for element1 in elements1: element1.click() time.sleep( 10 ) element2 = wd.find_element(By.CSS_SELECTOR, "#s_checkbox input[value='小雷老师']" ) element2.click() time.sleep( 10 ) print ( "当前选中的是:" + element2.get_attribute( 'value' )) |
select框
radio框以及checkbox框都是input元素,只是里面的type不同而已。select框则是一个新的select标签,对于select选择框,selenium专门提供了一个select类进行操作。
Select类提供了如下的方法
根据选择的value属性值,选择元素。
1 | select_by_value |
根据选项的次序(从1开始),选择元素
1 | select_by_index |
根据选项的可见文本,选择元素
1 | select_by_visible_text |
根据选项的value属性值,去除选中元素
1 | deselect_by_value |
根据选择的次序,去除选中元素
1 | deselect_by_index |
根据选项的可见文本,去除选中元素
1 | deselect_by_visible_text |
Select单选框
3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>选择框< / title> < / head> <body> <select id = "ss_single" > <option value = "小江老师" >小江老师< / option> <option value = "小雷老师" >小雷老师< / option> <option value = "小凯老师" selected = "selected" >小凯老师< / option> < / select> <select id = "ss_multi" multiple> <option value = "小江老师" >小江老师< / option> <option value = "小雷老师" >小雷老师< / option> <option value = "小凯老师" selected = "selected" >小凯老师< / option> < / select> < / body> < / html> |
对于select单选框,操作比较简单,不管原来选择的是什么,直接用Select方法选择即可。
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 select1 = Select(wd.find_element(By. ID , "ss_single" )) time.sleep( 10 ) select1.select_by_visible_text( "小雷老师" ) time.sleep( 10 ) |
Select多选框
对于select多选框,要选中某几个选项,要注意去掉原来已经选中的选项。
例如,我们选择示例多选框中的小雷老师和小凯老师。可以用select类的deselect_all方法,清除所有已经选中的选项。然后再通过select_by_visible_text方法选择小雷老师和小凯老师。
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 select1 = Select(wd.find_element(By. ID , "ss_multi" )) time.sleep( 10 ) select1.deselect_all() select1.select_by_visible_text( "小雷老师" ) select1.select_by_visible_text( "小凯老师" ) time.sleep( 10 ) |
八、Xpath选择器
Xpath语法简介
Xpath是由国际标准化组织W3C指定的,用来在XML和HTML文档中选择节点的语言。
目前主流浏览器(chrome、firefox、edge、safari)都支持Xpath语法,xpath有1和2两个版本,目前浏览器支持的是xpath1的语法。
Xpath语法中,整个HTML文档根节点用“/”表示,如果我们想选择的是根节点下面的html节点,则可以在搜索框中输入
1 | / html |
如果输入下面的表达式
1 | / html / body / div |
这个表达式表示选择html下面的body下面的div元素
自动化程序要使用Xpath来选择web元素,应该调用WebDriver对象的方法find_element_by_xpath或者find_elements_by_xpath
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 select1 = Select(wd.find_element(By.XPATH, "//select[@id='ss_multi']" )) time.sleep( 10 ) select1.deselect_all() select1.select_by_visible_text( "小雷老师" ) select1.select_by_visible_text( "小凯老师" ) time.sleep( 10 ) |
绝对路径选择
如果Xpath路径以正斜杠(/)开始,就表示从根节点开始。从根节点开始的路径表达式,就是某元素的绝对路径。/html/body/div等价于css表达式html>body>div。
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "/html/body/div" ) for element1 in elements1: print (element1.text) time.sleep( 10 ) |
运行结果:
相对路径选择
有时候,我们需要选择web中某一类型的所有web元素,不管它在什么位置。比如,选择页面的所有标签名为div的元素,如果使用CSS表达式,直接写一个div就行了。
在xpath中需要前面加//,表示从当前节点往下寻找所有的后代元素,不管它在什么位置。所以xpath表达式,应该这样写//div
//符号也可以继续加在后面,比如,要选择所有的div元素里面的所有的P元素,不管div在什么位置,也不管p元素在div下面的什么位置,则可以这样写//div//p
对应的自动化程序如下:
1 | elements1 = wd.find_elements(By.XPATH, "//div//p" ) |
//表示后代元素,/表示直接子节点
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "//body//div//p" ) for element1 in elements1: print (element1.text) time.sleep( 10 ) |
运行结果:
如果相匹配某标签的所有后代标签,使用*号
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "//body//div[@id='t2']//*" ) for element1 in elements1: print (element1.text) time.sleep( 10 ) |
运行结果:
根据属性选择
Xpath可以根据属性来选择元素。根据属性来选择元素是通过这种格式来的[@属性名='属性值'],注意(1)属性名注意前面有个@(2)属性值一定要用引号,可以是单引号,也可以是双引号
根据id属性选择
选择id为west的元素可以这样
1 | / / * [@ id = 'west' ] |
3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >选择框</ title > </ head > < body > < a href="https://www.baidu.com">百度</ a > < div class="plant">< span >土豆</ span ></ div > < div class="plant">< span >洋葱</ span ></ div > < div class="plant">< span >白菜</ span ></ div > < div class="animal">< span >狮子</ span ></ div > < div class="animal">< span >老虎</ span ></ div > < div class="animal">< span >山羊</ span ></ div > < div id="container"> < div id="layer1"> < div class="inner11">< span >内层11</ span ></ div > < div class="inner12">< span >内层12</ span ></ div > </ div > < div id="layer2"> < div class="inner21">< span >内层21</ span ></ div > < div class="inner22">< span >内层22</ span ></ div > </ div > </ div > < button id="clickme"></ button > < div id="t1"> < h3 >唐诗</ h3 > < span >李白</ span > < p >静夜思</ p > < span >杜甫</ span > < p >春夜喜雨</ p > </ div > < div id="t2"> < h3 >宋词</ h3 > < span >苏轼</ span > < p >赤壁怀古</ p > < p >明月几时有</ p > < p >江城子.乙卯正月二十夜记梦</ p > </ div > < div id="s_radio"> < input type="radio" name="teacher" value="小江老师">小江老师 < br > < input type="radio" name="teacher" value="小雷老师">小雷老师 < br > < input type="radio" name="teacher" value="小凯老师" checked="checked">小凯老师 </ div > < div id="s_checkbox"> < input type="checkbox" name="teacher" value="小江老师">小江老师 < br > < input type="checkbox" name="teacher" value="小雷老师">小雷老师 < br > < input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师 </ div > < select id="ss_single"> < option value="小江老师">小江老师</ option > < option value="小雷老师">小雷老师</ option > < option value="小凯老师" selected="selected">小凯老师</ option > </ select > < select id="ss_multi" multiple> < option value="小江老师">小江老师</ option > < option value="小雷老师">小雷老师</ option > < option value="小凯老师" selected="selected">小凯老师</ option > </ select > < div > < p style="color:brown;font-weight: bold"> 城市选择 </ p > < div id="china"> < p id="beijing" class="capital huge-city"> 北京 </ p > < p id="shanghai" class="huge-city"> 上海 </ p > </ div > < div id="us"> < span id="west" style="color: darkgreen"> < p id="newyork"> 纽约 </ p > < p id="huston"> 休斯顿 </ p > </ span > </ div > </ div > </ body > </ html > |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "//div[@id='us']" ) for element1 in elements1: print (element1.text) time.sleep( 10 ) |
运行结果:
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "//*[@id='us']" ) for element1 in elements1: print (element1.text) time.sleep( 10 ) |
运行结果:
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "//*[@id]" ) for element1 in elements1: print (element1.text) time.sleep( 10 ) |
运行结果如下:这样会选择所有带有id属性的元素
根据class属性选择
选择所有div元素中class为single_choice的元素,可以这样写
1 | / / div[@ class = 'single_choice' ] |
3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 | <!DOCTYPE html> <html lang = "en" > <head> <meta charset = "UTF-8" > <title>选择框< / title> < / head> <body> <a href = "https://www.baidu.com" >百度< / a> <div class = "plant" ><span>土豆< / span>< / div> <div class = "plant" ><span>洋葱< / span>< / div> <div class = "plant" ><span>白菜< / span>< / div> <div class = "animal" ><span>狮子< / span>< / div> <div class = "animal" ><span>老虎< / span>< / div> <div class = "animal" ><span>山羊< / span>< / div> <div id = "container" > <div id = "layer1" > <div class = "inner11" ><span>内层 11 < / span>< / div> <div class = "inner12" ><span>内层 12 < / span>< / div> < / div> <div id = "layer2" > <div class = "inner21" ><span>内层 21 < / span>< / div> <div class = "inner22" ><span>内层 22 < / span>< / div> < / div> < / div> <button id = "clickme" >< / button> <div id = "t1" > <h3>唐诗< / h3> <span>李白< / span> <p>静夜思< / p> <span>杜甫< / span> <p>春夜喜雨< / p> < / div> <div id = "t2" > <h3>宋词< / h3> <span>苏轼< / span> <p>赤壁怀古< / p> <p>明月几时有< / p> <p>江城子.乙卯正月二十夜记梦< / p> < / div> <div id = "s_radio" > < input type = "radio" name = "teacher" value = "小江老师" class = "single_choice" >小江老师 <br> < input type = "radio" name = "teacher" value = "小雷老师" class = "single_choice" >小雷老师 <br> < input type = "radio" name = "teacher" value = "小凯老师" checked = "checked" class = "single_choice" >小凯老师 < / div> <div id = "s_checkbox" > < input type = "checkbox" name = "teacher" value = "小江老师" >小江老师 <br> < input type = "checkbox" name = "teacher" value = "小雷老师" >小雷老师 <br> < input type = "checkbox" name = "teacher" value = "小凯老师" checked = "checked" >小凯老师 < / div> <select id = "ss_single" > <option value = "小江老师" >小江老师< / option> <option value = "小雷老师" >小雷老师< / option> <option value = "小凯老师" selected = "selected" >小凯老师< / option> < / select> <select id = "ss_multi" multiple> <option value = "小江老师" >小江老师< / option> <option value = "小雷老师" >小雷老师< / option> <option value = "小凯老师" selected = "selected" >小凯老师< / option> < / select> <div> <p style = "color:brown;font-weight: bold" > 城市选择 < / p> <div id = "china" > <p id = "beijing" class = "capital huge-city" > 北京 < / p> <p id = "shanghai" class = "huge-city" > 上海 < / p> < / div> <div id = "us" > <span id = "west" style = "color: darkgreen" > <p id = "newyork" > 纽约 < / p> <p id = "huston" > 休斯顿 < / p> < / span> < / div> < / div> < / body> < / html> |
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, '//input[@class="single_choice"]' ) for element1 in elements1: print (element1.get_attribute( 'value' )) time.sleep( 5 ) |
运行结果:
如果一个元素class有多个,如果要选择它,需要写全属性,不可以只写一个属性
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, '//p[@class="capital huge-city"]' ) for element1 in elements1: print (element1.get_attribute( 'id' )) time.sleep( 5 ) |
运行结果:
@后可以直接加属性值
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, '//select[@multiple]' ) for element1 in elements1: print (element1.get_attribute( 'id' )) time.sleep( 5 ) |
运行结果:
CSS选择器选择属性值包含某个字符串的元素
3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >选择框</ title > </ head > < body > < a href="https://www.baidu.com">百度</ a > < div class="plant">< span >土豆</ span ></ div > < div class="plant">< span >洋葱</ span ></ div > < div class="plant">< span >白菜</ span ></ div > < div class="animal">< span >狮子</ span ></ div > < div class="animal">< span >老虎</ span ></ div > < div class="animal">< span >山羊</ span ></ div > < div id="container"> < div id="layer1"> < div class="inner11">< span >内层11</ span ></ div > < div class="inner12">< span >内层12</ span ></ div > </ div > < div id="layer2"> < div class="inner21">< span >内层21</ span ></ div > < div class="inner22">< span >内层22</ span ></ div > </ div > </ div > < button id="clickme"></ button > < div id="t1"> < h3 >唐诗</ h3 > < span >李白</ span > < p >静夜思</ p > < span >杜甫</ span > < p >春夜喜雨</ p > </ div > < div id="t2"> < h3 >宋词</ h3 > < span >苏轼</ span > < p >赤壁怀古</ p > < p >明月几时有</ p > < p >江城子.乙卯正月二十夜记梦</ p > </ div > < div id="s_radio"> < input type="radio" class="single_choice" name="teacher" value="小江老师"/>小江老师 < input type="radio" class="single_choice" name="teacher" value="小雷老师"/>小雷老师 < input type="radio" class="single_choice" name="teacher" value="小凯老师" checked="checked"/>小凯老师 </ div > < div id="s_checkbox"> < input type="checkbox" name="teacher" value="小江老师">小江老师 < input type="checkbox" name="teacher" value="小雷老师">小雷老师 < input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师 </ div > < select class="multi-choice" id="ss_single"> < option value="小江老师">小江老师</ option > < option value="小雷老师">小雷老师</ option > < option value="小凯老师" selected="selected">小凯老师</ option > </ select > < select id="ss_multi" multiple> < option value="小江老师">小江老师</ option > < option value="小雷老师">小雷老师</ option > < option value="小凯老师" selected="selected">小凯老师</ option > </ select > < div > < p style="color:brown;font-weight: bold"> 城市选择 </ p > < div id="china"> < p id="beijing" class="capital huge-city"> 北京 </ p > < p id="shanghai" class="huge-city"> 上海 </ p > </ div > < div id="us"> < span id="west" style="color: darkgreen"> < p id="newyork"> 纽约 </ p > < p id="huston"> 休斯顿 </ p > </ span > </ div > </ div > </ body > </ html > |
比如,要选择a节点,里面的href属性包含了baidu字符串,就可以这样写
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, 'a[href*=baidu]' ) for element1 in elements1: print (element1.get_attribute( 'href' )) time.sleep( 5 ) |
运行结果:
还可以选择属性值以某个字符串开头的元素。比如,要选择a节点,里面的href属性以http开头,就可以这样写
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.CSS_SELECTOR, 'a[href^="http"]' ) for element1 in elements1: print (element1.get_attribute( 'href' )) time.sleep( 5 ) |
还可以选择属性值以某个字符串结尾的元素
属性值包含字符串
3.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >选择框</ title > </ head > < body > < a href="https://www.baidu.com">百度</ a > < div class="plant">< span >土豆</ span ></ div > < div class="plant">< span >洋葱</ span ></ div > < div class="plant">< span >白菜</ span ></ div > < div class="animal">< span >狮子</ span ></ div > < div class="animal">< span >老虎</ span ></ div > < div class="animal">< span >山羊</ span ></ div > < div id="container"> < div id="layer1"> < div class="inner11">< span >内层11</ span ></ div > < div class="inner12">< span >内层12</ span ></ div > </ div > < div id="layer2"> < div class="inner21">< span >内层21</ span ></ div > < div class="inner22">< span >内层22</ span ></ div > </ div > </ div > < button id="clickme"></ button > < div id="t1"> < h3 >唐诗</ h3 > < span >李白</ span > < p >静夜思</ p > < span >杜甫</ span > < p >春夜喜雨</ p > </ div > < div id="t2"> < h3 >宋词</ h3 > < span >苏轼</ span > < p >赤壁怀古</ p > < p >明月几时有</ p > < p >江城子.乙卯正月二十夜记梦</ p > </ div > < div id="s_radio"> < input type="radio" class="single_choice" name="teacher" value="小江老师"/>小江老师 < input type="radio" class="single_choice" name="teacher" value="小雷老师"/>小雷老师 < input type="radio" class="single_choice" name="teacher" value="小凯老师" checked="checked"/>小凯老师 </ div > < div id="s_checkbox"> < input type="checkbox" name="teacher" value="小江老师">小江老师 < input type="checkbox" name="teacher" value="小雷老师">小雷老师 < input type="checkbox" name="teacher" value="小凯老师" checked="checked">小凯老师 </ div > < select class="multi-choice" id="ss_single"> < option value="小江老师">小江老师</ option > < option value="小雷老师">小雷老师</ option > < option value="小凯老师" selected="selected">小凯老师</ option > </ select > < select id="ss_multi" multiple> < option value="小江老师">小江老师</ option > < option value="小雷老师">小雷老师</ option > < option value="小凯老师" selected="selected">小凯老师</ option > </ select > < div > < p style="color:brown;font-weight: bold"> 城市选择 </ p > < div id="china"> < p id="beijing" class="capital huge-city"> 北京 </ p > < p id="shanghai" class="huge-city"> 上海 </ p > </ div > < div id="us"> < span id="west" style="color: darkgreen"> < p id="newyork"> 纽约 </ p > < p id="huston"> 休斯顿 </ p > </ span > </ div > </ div > </ body > </ html > |
要选择style属性值包含color字符串的页面元素,可以这样
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "//*[contains(@style, 'color')]" ) for element1 in elements1: print (element1.get_attribute( 'style' )) time.sleep( 5 ) |
运行结果:
要选择style属性值以color字符串开头的页面元素,可以这样
1 2 3 4 5 6 7 8 9 10 11 12 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/3.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 elements1 = wd.find_elements(By.XPATH, "//*[starts-with(@style, 'color')]" ) for element1 in elements1: print (element1.get_attribute( 'style' )) time.sleep( 5 ) |
运行结果:
要选择style属性值以color字符串结尾的页面元素,可以这样
1 | / / * [ends - with(@style, 'color' )] |
按次序选择
前面学习过的CSS表达式可以根据元素在父节点中的次序选择。
Xpath也可以根据次序选择元素。语法比CSS更简洁,直接在方括号中使用数字表示次序。
某类型第几个子元素。比如,要选择p类型第2个的子元素
1 | / / p[ 2 ] |
注意,选择的是p类型的第2个的子元素,不是第2个子元素,并且是p类型。
再比如,要选取父元素为div中的p类型第2个子元素
1 | / / div / p[ 2 ] |
第几个子元素
也可以选择第2个子元素,不管是什么类型,采用通配符,比如选择父元素为div的第2个子元素,不管是什么类型。
1 | / / div / * [ 2 ] |
倒数第1个子元素
1 | / / p[last()] |
倒数第2个子元素
1 | / / p[last() - 1 ] |
范围选择
Xpath还可以选择子元素的次序范围。比如,选择option类型的第1到2个子元素
1 | / / option[position()< = 2 ] |
或者
1 | / / option[position()< 3 ] |
1 | / / * [@ class = 'multi-choice' ] / option[position()< 3 ] |
如果想表示后几个
1 | / / * [@ class = 'multi-choice' ] / option[position()> = last() - 2 ] |
组选择和兄弟节点
组选择
CSS有组选择,可以同时使用多个表达式,多个表达式选择的结果都是要选择的元素。CSS组选择,表达式之间用逗号隔开。Xpath也有组选择,使用竖线隔开多个表达式。
比如,要选择所有的option元素和所有的h4元素,可以使用
1 | / / option | / / h4 |
等同于CSS选择器
1 | option,h4 |
再比如,要选择所有的class为single_choice和class为multi_choice的元素,可以使用
1 | / / * [@ class = 'single_choice' ] | / / * [@ class = 'multi_choice' ] |
等同于CSS选择器
1 | .single_choice,.multi_choice |
选择父节点
Xpath可以选择父节点,这是CSS做不到的。
某个元素的父节点用/..表示。比如,要选择id为china的节点的父节点,可以这样写//*[@id=’china’]/..,还可以继续向上找上层父节点,比如//*[@id='china']/../../..
兄弟节点选择
相邻兄弟节点选择
Xpath也可以选择后续的兄弟节点,用这样的语法following-sibling::
比如要选择class为single_choice的元素的所有后续兄弟节点
1 | / / * [@ class = ’single_choice’] / following - sibling:: * |
等同于CSS选择器.single_choice~*
如果,要选择后续节点中的div节点,就应该这样写
1 | / / * [@ class = ’single_choice’] / following - sibling::div |
Xpath还可以选择前面的兄弟节点,用这样preceding-sibling::
比如,要选择class为single_choice的元素的所有后续兄弟节点
1 | / / * [@ class = ’single_choice’] / preceding - sibling:: * |
而CSS选择器无法选择前面的兄弟节点。
Selenium实战技巧
更多动作,之前我们对web元素的操作主要是选择元素、然后点击元素或者输入字符串,还有其他操作,比如鼠标右键点击、双击、移动鼠标到某个元素、鼠标拖拽等,这些操作可以通过Selenium提供的ActionChains类来实现。
模拟鼠标悬停在百度页面的更多上
Selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 | import time from selenium import webdriver from selenium.webdriver import ActionChains from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.implicitly_wait( 3 ) wd.get( "https://www.baidu.com" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 ac = ActionChains(wd) #鼠标移动到元素上 ac.move_to_element( wd.find_element(By.CSS_SELECTOR, '[name=tj_briicon]' ) ).perform() time.sleep( 10 ) |
运行结果如下:
冻结界面
有些网站上面的元素,我们的鼠标放在上面会弹出一些内容,比如百度首页的右上角,有个更多产品选项。
如果我们把鼠标放在上面,就会弹出下面的图标。如果我们要用selenium自动化点击图标,就需要F12查看这个元素的特征。
但是我们的鼠标从图标移开后,这个栏目就整个消失了,就没有办法查看对应的HTML。
可以在浏览器的Console中输入如下代码
1 | setTimeout(function(){debugger}, 5000 ) |
表示在5000ms后,执行debugger命令。执行该命令会使浏览器进入debug状态。Debug状态有个特性,页面被冻住,不管我们怎么点击页面都不会触发事件。
所以,我们可以在输入上面代码并回车执行后,立即鼠标方法页面右上角更多产品处。这个时候就会弹出图标
弹出对话框
有的时候,我们经常会在操作页面的时候,出现一些弹出的对话框。
对话框有三种类型,分别是Alert(警告信息)、Confirm(确认信息)和prompt(提示输入)
Alert
Alert弹出框,目的就是显示通知信息,只需要用户看完信息后,点击OK确定即可。
Name自动化时如何模拟用户点击OK按钮呢?
1 | driver.switch_to.alert.accept() |
如果程序想要获取弹出对话框中的信息内容,可以通过如下代码:
1 | driver.switch_to.alert.text |
4.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >对话框、确认框、提示框</ title > </ head > < script type="text/javascript"> function functionA(){ alert("一起学习selenium") } function functionB(){ confirm("你确定要和我一起学习selenium吗") } function functionC(){ prompt("输入你想学习的课程") } </ script > < body > < input type="button" name="btn1" id="btn1" value="alert" onclick="functionA()"> < input type="button" name="btn2" id="btn2" value="confirm" onclick="functionB()"> < input type="button" name="btn3" id="btn3" value="prompt" onclick="functionC()"> </ body > </ html > |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/4.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "input[name='btn1']" ) element1.click() time.sleep( 5 ) wd.switch_to.alert.accept() time.sleep( 5 ) |
Confirm
Confirm弹出框,主要是让用户确认是否要进行某个操作。
比如:当管理员在网站上选择删除了某个账号时,就可能弹出confirm弹出框,要求确认是否确定要删除。
Confirm弹出框有两个选择供用户选择,分别是OK和Cancel,分别代表确定和取消操作。
那么,自动化的时候,代码怎么模拟用户点击OK或者Cancel按钮呢?
Selenium提供如下方法进行操作:
如果我们想点击OK按钮,还是用刚才的accept方法,如下:
1 | driver.switch_to.alert.accpet() |
如果我们想点击Cancel按钮,可以用dismiss方法,如下:
1 | driver.switch_to.alert.dismiss() |
4.html
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 | <! DOCTYPE html> < html lang="en"> < head > < meta charset="UTF-8"> < title >对话框、确认框、提示框</ title > </ head > < script type="text/javascript"> function functionA(){ alert("一起学习selenium") } function functionB(){ confirm("你确定要和我一起学习selenium吗") } function functionC(){ prompt("输入你想学习的课程") } </ script > < body > < input type="button" name="btn1" id="btn1" value="alert" onclick="functionA()"> < input type="button" name="btn2" id="btn2" value="confirm" onclick="functionB()"> < input type="button" name="btn3" id="btn3" value="prompt" onclick="functionC()"> </ body > </ html > |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 | import time from selenium import webdriver from selenium.webdriver.chrome.service import Service from selenium.webdriver.common.by import By wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/4.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "input[name='btn2']" ) element1.click() time.sleep( 5 ) wd.switch_to.alert.accept() time.sleep( 5 ) element1.click() time.sleep( 5 ) wd.switch_to.alert.dismiss() time.sleep( 5 ) |
Prompt
出现Prompt弹出框是需要用户输入一些信息,提交上去。
比如:当管理员在网站上选择给某个账号延期时,就可能会弹出Prompt弹出框,要求输入延期多长时间。
可以调用如下方法
1 | driver.switch_to.alert.send_keys() |
selenium_test1.py
1 2 3 4 5 6 7 8 9 10 11 | wd = webdriver.Chrome(service = Service(r "D:\个人知识总结\python project\selenium\chromedriver-win64\chromedriver-win64\chromedriver.exe" )) #调用webService对象的get方法,可以让浏览器打开指定的网址 wd.get( "D:/个人知识总结/python project/selenium/4.html" ) # 根据id选择元素,返回的就是该元素对应的webElement对象。 element1 = wd.find_element(By.CSS_SELECTOR, "input[name='btn3']" ) element1.click() time.sleep( 5 ) wd.switch_to.alert.send_keys( 'selenium' ) wd.switch_to.alert.accept() time.sleep( 5 ) wd.quit() |
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 全程不用写代码,我用AI程序员写了一个飞机大战
· DeepSeek 开源周回顾「GitHub 热点速览」
· 记一次.NET内存居高不下排查解决与启示
· MongoDB 8.0这个新功能碉堡了,比商业数据库还牛
· .NET10 - 预览版1新功能体验(一)