webdriver定位元素
1、id定位: find_element_by_id()
最保险的方法
从上面定位到的搜索框属性中,有个id="kw"的属性,我们可以通过这个id定位到这个搜索框
代码:
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_id('kw').send_keys('selenium')
sleep(5)
driver.quit()
2、name定位: find_element_by_name()
从上面定位到的搜索框属性中,有个name="wd"的属性,我们可以通过这个name定位到这个搜索框
name可能出现重复!!!
代码:
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_name('wd').send_keys('selenium')
sleep(5)
driver.quit()
3、class定位:find_element_by_class_name()
从上面定位到的搜索框属性中,有个class="s_ipt"的属性,我们可以通过这个class定位到这个搜索框
页面上有多个复选框,做多选框!!!
多个元素可以使用,返回的是列表!每一个值是页面元素
代码:
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_class_name('s_ipt').send_keys('selenium')
sleep(5)
driver.quit()
4、tag定位:find_element_by_tag_name()
很少用,重复概率太高!!!!
如果懂HTML知识,我们就知道HTML是通过tag来定义功能的,比如input是输入,table是表格,等等...。每个元素其实就是一个tag,一个tag往往用来定义一类功能,我们查看百度首页的html代码,可以看到有很多div,input,a等tag,所以很难通过tag去区分不同的元素。基本上在我们工作中用不到这种定义方法,仅了解就行。下面代码仅做参考,运行时必定报错
代码:
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_tag_name('input').send_keys('selenium')
sleep(5)
driver.quit()
5、link定位:find_element_by_link_text()
此种方法是专门用来定位文本链接的,比如百度首页右上角有“新闻”,“hao123”,“地图”等链接
看文本信息!!!!
我们来定位“新闻”这个链接元素
代码:
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_link_text('新闻').click()
sleep(5)
driver.quit()
6、partial_link定位:find_element_by_partial_link_text()
有时候一个超链接的文本很长很长,我们如果全部输入,既麻烦,又显得代码很不美观,这时候我们就可以只截取一部分字符串,用这种方法模糊匹配了。
给部分链接部分文本信息,不要和页面其他文本信息重复,唯一性!!!!
我们用这种方法来定位百度首页的“新闻”超链接
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_partial_link_text('闻').click()
sleep(5)
driver.quit()
7、xpath定位:find_element_by_xpath()
前面介绍的几种定位方法都是在理想状态下,有一定使用范围的,那就是:在当前页面中,每个元素都有一个唯一的id或name或class或超链接文本的属性,那么我们就可以通过这个唯一的属性值来定位他们。
但是在实际工作中并非有这么美好,有时候我们要定位的元素并没有id,name,class属性,或者多个元素的这些属性值都相同,又或者刷新页面,这些属性值都会变化。那么这个时候我们就只能通过xpath或者CSS来定位了。
绝对路径(理解)
属性定位(理解)
父子关系(理解)
使用逻辑运算符定位(理解)
浏览器直接复制(熟悉)
代码:
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_xpath("//*[@id='kw']").send_keys('selenium')
sleep(5)
driver.quit()
8、CSS定位:find_element_by_css_selector()
这种方法相对xpath要简洁些,定位速度也要快些,但是学习起来会比较难理解,这里只做下简单的介绍。
[可以看这个链接深入学习](https://blog.csdn.net/galen2016/article/details/71106900)
. 表示类选择器
> 表示父子关系
也可以直接通过浏览器复制
CSS定位百度搜索框
from time import sleep
from selenium import webdriver
driverfile_path = r'D:\coship\Test_Framework\drivers\chromedriver.exe'
driver = webdriver.Chrome(executable_path=driverfile_path)
driver.get(r'https://www.baidu.com/')
driver.find_element_by_css_selector('#kw').send_keys('selenium')
sleep(5)
driver.quit()
webdriver api
1.driver.current_url:用于获得当前页面的URL
2.driver.title:用于获取当前页面的标题
3.driver.page_source:用于获取页面html源代码
4.driver.current_window_handle:用于获取当前窗口句柄
5.**多窗口操作**
首先用于获取所有窗口句柄
handles = driver.window_handles:用于获取所有窗口句柄
然后将句柄绑定给driver,参数是***剧本元素的位置(0,1,2,3等)
driver.switch_to_window(handles[x])
8.element.is_displayed():返回元素结果是否可见(True 或 False)
9.element.is_selected():返回元素结果是否被选中(True 或 False)
6.driver.find_element_by***** 定位元素,有18种
7.driver.get(url):浏览器加载url。
8.driver.forward():浏览器向前(点击向前按钮)。
9.driver.back():浏览器向后(点击向后按钮)。
10.driver.refresh():浏览器刷新(点击刷新按钮)。
11driver.close():关闭当前窗口,或最后打开的窗口。
12.driver.quit():关闭所有关联窗口,并且安全关闭session。不管页面几个窗口,一律关掉
13.driver.maximize_window():最大化浏览器窗口。
14.driver.set_window_size(宽,高):设置浏览器窗口大小。
15.driver.get_window_size():获取当前窗口的长和宽。
16.driver.get_window_position():获取当前窗口坐标。
17.driver.get_screenshot_as_file(filename):截取当前窗口。
18.driver.implicitly_wait(秒):隐式等待,通过一定的时长等待页面上某一元素加载完成。若提前定位到元素,则继续执行。若超过时间未加载出,则抛出NoSuchElementException异常。
19.driver.switch_to_frame(id或name属性值):切换到新表单(同一窗口)。若无id或属性值,可先通过xpath定位到iframe,再将值传给switch_to_frame()
driver.switch_to.frame(id或name,或定位到的frame)
20.driver.switch_to.parent_content():跳出当前一级表单。该方法默认对应于离它最近的switch_to.frame()方法。
21.driver.switch_to.default_content():跳回最外层的页面。
22.driver.switch_to_window(窗口句柄):切换到新窗口。
23.driver.switch_to.window(窗口句柄):切换到新窗口。
24.driver.switch_to_alert():警告框处理。处理JavaScript所生成的alert,confirm,prompt.
25.driver.switch_to.alert():警告框处理。
26.driver.execute_script(js):调用js。
27.driver.get_cookies():获取当前会话所有cookie信息。
28.driver.get_cookie(cookie_name):返回字典的key为“cookie_name”的cookie信息。
29.driver.add_cookie(cookie_dict):添加cookie。“cookie_dict”指字典对象,必须有name和value值。
30.driver.delete_cookie(name,optionsString):删除cookie信息。
31.driver.delete_all_cookies():删除所有cookie信息。
driver.get_screenshot_as_file("{}.{}".format("e://aaa","png"))
1.element.size:获取元素的尺寸。
2.element.text:获取元素的文本。
3.element.tag_name:获取标签名称。
4.element.clear():清除文本。
5.element.send_keys(value):输入文字或键盘按键(需导入Keys模块)。
6.element.click():单击元素。
7.element.get_attribute(name):获得属性值
8.element.find_element*():定位元素,用于二次定位。
鼠标操作
鼠标事件
from selenium.webdriver.common.action_chains import ActionChains
常用方法:
perform():执行所有ActionChains中存储的行为
context_click():右击
double_click():双击
drag_and_drop():拖动
move_to_element():鼠标悬停
click(on_element=None)
click_and_hold(on_element=None)
context_click(on_element=None)
double_click(on_element=None)
drag_and_drop(source, target)
drag_and_drop_by_offset(source, xoffset, yoffset)
move_by_offset(xoffset, yoffset)
move_to_element(to_element)
move_to_element_with_offset(to_element, xoffset, yoffset)
release(on_element=None)
perform()
键盘事件:keys()类提供了键盘上的按键方法
需要导入以下的包:
from selenium.webdriver.common.keys import Keys
label.send_keys("input输入的内容")
label.send_keys(Keys.BACK_SPACE)
label.send_keys(Keys.CONTRL,'a')
label.send_keys(Keys.CONTRL,'v')
label.send_keys(Keys.CONTRL,'c')
label.send_keys(Keys.CONTRL,'x‘’)
label.send_keys(Keys.ENTER)
模式窗口:只有你关闭这个窗口,其他操作做不了
非模式窗口:不用关闭窗口,也可以其他操作
警告框——alter:是一个模式框
1、driver对象是一个当前页面窗口内,但是不在alter上,并且没办法定位窗口上的元素
2、driver.switch_to.alter():暂时将driver对象交给alter用
3、可以对alter警告窗口做什么事情:
text:返回(获取)alter/confirm/prompt中的文字信息
accept():接收现有警告框,就是点他的确定按钮
dismiss():放弃现有警告框,取消
send_keys(keysToSend):发送文本至警告框。
多表单:
一个页面中可以嵌套另一个页面,webdiriver对象只能在一个页面(外层是默认的)定位,
需要一种方式将driver对象从外层切换到内层对象进行处理
webdriver中提供API:driver.switch_to.frame()实现
"""
元素等待:
webdriver提供了三种等待方法:
强制等待:
time.sleep(5),单位秒,直接让线程休眠,这几秒什么也不干
隐式等待:
在脚本创建driver对象之后,给driver设置一个全局等待时间,
对driver的整个生命周期(创建到关闭)都起效果。
如果在设置的等待时间(超出时间)内,定位到了页面元素,则不再等待,继续执行下面代码
如果超出等待时间,则抛出异常
driver.implicity_wait(10)
注意:在使用隐式等待实际上浏览器会在自己设置的等待时间内不断刷新页面去寻找
要求在后续写代码时候,全部加上这句话
显示等待:
等到元素出现才操作,如果超时则抛出异常
构造WebDriverWait一个对象
WebDriverWait(driver,timeout,pool_frequency=0.5,ignored_exceptions=None)
until(method,info):直到满足某一个条件,返回结果,等不到报错
method--->expected_conditions.presence_of_element_located(locator):判断是不是定位到了
locator---》By.Id,By.Name
需求:显示等待去等百度首页。显示出来就点击,否则print
如果同时设置了显示等待和隐式等待,以隐式等待为第一级,对time.sleep()没有影响