from selenium.webdriver.edge.service import Service
service = Service(executable_path=".././msedgedriver.exe")
browser = webdriver.Edge(service=service)
browser.get(r'https://www.baidu.com/')
browser.get_screenshot_as_file('截图.png')
browser.maximize_window()
browser.set_window_size(500,500)
browser.set_window_size(1000,800)
browser.refresh()
browser.back()
browser.forward()
print(browser.title)
print(browser.current_url)
print(browser.name)
print(browser.page_source)
browser.find_element(by=By.ID, value="su").click()
find_element(By.ID,"kw")
find_element(By.NAME,"wd")
find_element(By.CLASS_NAME,"s_ipt")
find_element(By.TAG_NAME,"input")
find_element(By.link_TEXT,u"新闻")
find_element(By.PARTIAL_link_TEXT,u"新")
find_element(By.XPATH,"//*[@class='bg s_btn']")
find_element(By.CSS_SELECTOR,"span.bg s_btn_wr>input#su")
1.ID具有唯一性,若是当前标签含有id属性,可以优先使用id定位。
driver.find_element(by=By.ID, value='id后面的字符串')
2.name属性不唯一,一个页面可能有多个相同的name值,所以使用时要确保该属性值是唯一的
driver_name = driver.find_element(by=By.NAME, value='q')
driver_name.send_keys("作者是帅哥")
3.CLASS_NAME
driver_name = driver.find_element(by=By.CLASS_NAME, value='sb_form_q')
driver_name.send_keys("作者是帅哥")
4.LINK_TEXT,用于<a>标签定位
driver_name = driver.find_element(by=By.LINK_TEXT, value='文案')
driver_name.click()
5.PARTIAL_LINK_TEXT,PARTIAL_LINK_TEXT与LINK_TEXT相似,都是用于超链接,区别在于前置value为模糊查询,后者匹配相等
driver_name = driver.find_element(by=By.LINK_TEXT, value='案')
driver_name.click()
6.TAG_NAME, 用于标签定位(<a>,<p>,<input>....),该元素定位不常用,效率低
driver_name = driver.find_element(by=By.TAG_NAME, value='input')
driver_name.send_keys("作者是帅哥")
7.XPATH
(1)可理解为元素路径定位,内含两种定位,绝对路径和相对路径
绝对路径:以/html开头
相对路径:以//*开头
driver.find_element(by=By.XPATH, value="//*[@id='sb_form_q' and @name='q']").send_keys("作者是帅哥")
driver.find_element(by=By.XPATH, value="/html/body/div[2]/div/div[3]/div[2]/form/div[1]/input").send_keys("作者是帅哥")
网页开发者模式F12下的复制:
Copy XPath : 相对路径
Copy full XPath : 相对路径
(2)XPATH用法拓展(适用于相对路径)
(1).contains用法 [contains(@属性,"属性值")]:模糊匹配
driver.find_element(by=By.XPATH, value="//*[contains(@name,'na') and (@id,'sb_form_q')]").send_keys("作者说帅哥")
(2).starts-with用法 [starts-with(@属性,"属性值")]:匹配以XXX开头
driver.find_element(by=By.XPATH, value="//*[starts-with(@name,'2') and contains(@id,'2')]").send_keys("12")
8.CSS_SELECTOR
(1)层级语法定位 网页开发者模式F12下的复制:层级定位可直接copy selector即可
driver.find_element(by=By.CSS_SELECTOR, value="copy selector").click()
(2)选择器定位
1.id选择器,这里需要在value值前加个
driver.find_element(by=By.CSS_SELECTOR, value="#sb_form_q").click()
2.class选择器
driver.find_element(by=By.CSS_SELECTOR, value="[class='sb_form_q']").send_keys("class选择器")
3.属性选择器
语法一:value="[属性='属性值']"
driver.find_element(by=By.CSS_SELECTOR, value="[name='q']").send_keys("属性选择器")
driver.find_element(by=By.CSS_SELECTOR, value="[id='sb_form_q']").send_keys("属性选择器")
语法二:value="标签[属性=‘属性值’]"
driver.find_element(by=By.CSS_SELECTOR, value="a[id='halou']").click()
(3)CSS_SELECTOR拓展
匹配以XX开头:value="[id^='head']")
匹配以XX结尾:value="[id$='tail']"
模糊匹配:valur="[name*='like']"
XPATH定位
- 以
/
开头,绝对路径,非常依赖于页面的顺序和位置 - 以
//
开头,相对路径,不依赖于页面的顺序和位置,只看整个页面当中有没有符合表达式的元素 .
选取当前节点,..
选取当前节点的父节点@
选取属性 ,//标签名称[@属性名称=值] 比如://*[@id="kw"
- 逻辑运算
and
条件与
;or
条件或
,//标签名称[@属性名称=值 and 属性名称=值 ]
,//div[@class="xxx" and contains(@style,"display:visibility")]
*
通配符。匹配所有 //*
; @*
通配符。匹配所有属性 //*[@*="hello"]
语法规则
表达式 | 作用 |
---|
nodename | 选取此层级节点下的所有子节点 |
/ | 代表从根节点进行选取 |
// | 可以理解为匹配,就是在所有节点中选取此节点,直到匹配为止 |
. | 选取当前节点 |
… | 选取当前节点上一层(上一级目录) |
@ | 选取属性(也是匹配) |
标签定位
方式 | 效果 |
---|
/html/body/div | 表示从根节点开始寻找,标签与标签之间/ 表示一个层级 |
/html//div | 表示多个层级 作用于两个标签之间(也可以理解为在html下进行匹配寻找标签div) |
//div | 从任意节点开始寻找,也就是查找所有的div标签 |
./div | 表示从当前的标签开始寻找div |
属性定位
需求 | 格式 |
---|
定位div中属性名为href,属性值为‘www.baidu.com’的div标签 | @属性名=属性值 |
href为属性名 'www.baidu.com’为属性值 | /html/body/div[href=‘www.baidu.com’] |