selenium切换到div_Python系统学习 - Selenium之WebDriver API

selenium切换到div_Python系统学习 - Selenium之WebDriver API_第1张图片

好久不见,经历了国庆节、中秋节~,我又回来啦,这次我们会学习到很多新知识,主要是对上一章Selenium对WebDriver进行一个学习,掌握大部分对控件的定位及操作


本章的源码及学习资源:​pan.baidu.com

好了下面,我们直接先从本章的知识点进行了解(内容很长很长很长,因为我都放在一个py文件了哈哈哈,凡事不要慌,我已经帮你们分好点了)


Selenium Begin:
1.安装Selenium: pip3 install selenium
2.第一个Selenium自动化测试脚本 test_baidu.py (要注意chrome浏览器对自身版本和chromedriver对版本要相匹配)
3.WebDriver的8种定位方法:
a、id定位:通过元素的id来定位
b、name定位:通过元素的name来定位
c、class定位:通过元素的class类名来定位
d、tag定位:通过元素的标签名来定位如:
定位一个输入框,即find_element_by_tag_name("input")
e、link定位:通过元素所包含的link链接的名称来定位,
hao123,即find_element_by_link_text("hao123")
f、partial link定位:通过元素所包含的link链接的名称来定位,当其名称很长时,对部分文字定位也可行,
一个很长的文本链接,即find_element_by_partial_link_text("文本链接")
g、XPath定位:
(1)、绝对路径定位:
如定位百度输入框,通过代码层级结构:find_element_by_xpath("/html/body/div/div[2]/div/div/div/form/span/input")
(2)、利用元素属性定位:
如定位百度输入框,通过元素属性值来定位:find_element_by_xpath("//input[@id = "kw"]")
该元素的任意属性值都可以使用,如果不想指定标签名,可以用 * 号代替
(3)、层级与属性结合:
如定位百度输入框,假如输入框没有可利用的属性值,可以查找它上一级的属性:find_element_by_xpath("//span[@class = "bg s_ipt_wr"]/input")
(4)、使用逻辑运算符:
如定位百度输入框,如果一个属性不能唯一区分一个元素,那么我们可以使用逻辑运算符连接多个属性来查找元素:find_element_by_xpath("//input[@id = "kw" and @class = "s_ipt"]")
(5)、使用contains方法:
如定位百度输入框,用于匹配一个属性中包含的字符串:find_element_by_xpath("//span[contains(@class, "s_ipt_wr")]/input")
(6)、使用text()方法:
如定位e中的a标签,find_element_by_xpath("//a[text(), "hao123"]")
h、CSS_selector定位:
(1)、通过class定位:
如定位百度输入框:find_element_by_css_selector(".s_ipt") 定位class = "s_ipt"的所有元素
(2)、通过id定位:
如定位百度输入框:find_element_by_css_selector("#kw") 定位id = "kw"的所有元素
(3)、通过标签名定位:
如定位百度输入框:find_element_by_css_selector("input") 定位所有的input标签元素
(4)、通过标签层级关系定位:
如定位百度输入框:find_element_by_css_selector("span > input") 定位父元素为span的所有input标签元素
(5)、通过属性定位:
如定位百度输入框:find_element_by_css_selector("[autocomplete = off]") 定位autocomplete属性 = off的所有标签元素
(6)、组合定位:
如定位百度输入框:find_element_by_css_selector("form.fm > span > input.s_ipt") 定义class为fm的父标签form的span的class为s_ipt的input标签元素
(7)、更多定位方法可查看 http://www. w3school.com.cn/cssref/ css_selectors.asp ,XPath和CSS都提供来了非常强大且灵活的定位方法,我们只需掌握一种即可解决大部分问题
i、用By定位元素:
通过By也其实所WebDriver的另一套写法,这种更易阅读和理解,强推!!!!!!!
统一调用find_element()方法,通过By来声明定位,并且传入对应定位方法的定位参数,如:
首先需要导入By:
from selenium.webdriver.common.by import By
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, "hao123")
find_element(By.PARTIAL_LINK_TEXT, "hao1")
find_element(By.XPATH, "//*[@class = "bg s_btn"]")
find_element(By.CSS_SELECTOR, "span.bg s_btn_wr > input#su")
Warning:当class = “bg asd”这种存在空格情况的时候,取其中一个定位即可,并需要确认其唯一性
4.控制浏览器:
a、控制浏览器窗口大小:driver.set_window_size(1000, 1000)
b、控制浏览器前进、后退:driver.forward()、driver.back()
c、刷新浏览器:driver.refresh()
5.WebDriver中常用方法:
a、清除文本:search_frame.clear()
b、模拟按键输入:search_frame.send_keys("Appium & Selenium")
c、提交表单:search_button.submit()
d、返回元素尺寸:search_frame.size
e、获取元素到文本:search_frame.text
f、获得属性值:search_frame.get_attribute("name")
g、判断该元素是否用户可见:search_frame.is_displayed()
6.鼠标操作:
(需要先导入from selenium.webdriver import ActionChains)
a、执行ActionChains类中存储的所有行为:ac(driver).move_to_element(driver.find_element(By.ID, "s-usersetting-top")).perform()
b、右击:context_click()
c、双击:ac(driver).move_to_element(driver.find_elementac(driver).move_to_element(driver.find_element(By.ID, "s-usersetting-top")).perform()(By.NAME, "tj_briicon")).double_click().perform()
d、拖动:# driver切换到新页面并执行 拖动
windows = driver.window_handles
driver.switch_to.window(windows[-1])
ac(driver).drag_and_drop(driver.find_element(By.XPATH, "//a[@href = '小度商城官网']"),
driver.find_element(By.CLASS_NAME, "s_ipt_wr")).perform()
e、鼠标悬停:ac(driver).move_to_element(driver.find_element(By.ID, "s-usersetting-top")).perform()
以上为显示各方法的独立执行效果,实际项目中,可使用如下写法步骤清晰,完整执行:
ac = ActionChains(driver)
ac.move_to_element(xxxx) # xxxx是定位到的元素
ac.double_click()
ac.perform()
7.键盘操作:
(需要先导入from selenium.webdriver.common.keys import Keys)
a、删除键:send_keys(Keys.BACK_SPACE)
b、空格键:send_keys(Keys.SPACE)
c、制表键:send_keys(Keys.TAB)
d、回退键esc:send_keys(Keys.ESCAPE)
e、回车键:send_keys(Keys.ENTER)
f、全选:send_keys(Keys.CONTROL, 'a')
g、复制:send_keys(Keys.CONTROL, 'c')
h、剪切:send_keys(Keys.CONTROL, 'x')
i、粘贴:send_keys(Keys.CONTROL, 'v')
j、键盘F1:send_keys(Keys.F1')
……
z、键盘F12:send_keys(Keys.F12)
8、获得验证信息:
(最常用的几个验证信息用于web自动化测试中,如后续断言使用)
a、获取当前页面标题:print("当前界面的title是:%s" %(driver.title))
b、获取当前页面URL:print("当前界面的url是:%s" %(driver.current_url))
c、获取当前页面元素的文本信息:print("当前页面的文本信息是:%s" %(driver.find_element(By.CLASS_NAME, "s-top-right-text").text))
9、设置元素等待:
(需要导入:from selenium.webdriver.support.ui import WebDriverWait + from selenium.webdriver.support import expected_conditions)
a、显式等待:显式等待会等到这个元素出现后,才进行下一步
baidu_input = WebDriverWait(driver, 5, 0.5).until(ec.visibility_of_element_located((By.ID, "kw")))
baidu_input.send_keys("我是显式等待,我等到了!")
b、隐式等待:隐式等待会在整个页面中等待所有元素,当代码需要定位当元素定位到之后边会继续进行,超时一直定位不到则报异常
driver.implicitly_wait(10)
baidu_input = driver.find_element(By.ID, "kw")
baidu_input.send_keys("我是隐式等待,我等到了")
如下是expected_contions类提供到预期条件判断的几个方法:(最后只列举几个)
(1)、判断当前页面标题是否等于预期:title_is()
(2)、判断当前页面标题是否包含预期字符串:title_contains()
(3)、判断元素是否在DOM树里,并不代表该元素一定可见:presence_of_element_located()
(4)、判断元素是否可见:visibility_of_element_located()
(5)、与上一个方法作用相同,上一个方法的参数为定位,该方法接收定位后的元素:visibility_of()
(6)、判断是否至少有一个元素在DOM树中:presence_of_all_elements_located()
(7)、判断某个元素中的text是否包含预期字符串:text_to_be_present_in_element()
(8)、判断某个元素的value是否包含预期字符串:text_to_be_present_in_element_value()
(9)、判断该表单是否可以切换进去:frame_to_be_available_and_switch_to_it()
(10)、判断某个元素是否在DOM树中不可见:invisibility_of_element_located()
(11)、判断某个元素是否可见并是可点击的:element_to_be_clickable()
(12)、等到一个元素从DOM树中移除,可判断界面是否刷新:staleness_of()
(13)、判断某个元素是否被选中:element_to_be_selected()
(14)、判断某个元素的选中状态是否符合预期:element_selection_state_to_be()
(15)、与上一个方法作用相同,只是上一个方法参数为定位后的元素,该方法接收的参数为定位:element_located_selection_state_to_be()
(16)、判断页面上是否存在alert:alert_is_present()
例子:
expected_conditions预期条件判断方法
current_title = ec.title_is("百度一下,你就知道")
print(current_title(driver))
current_title_contains = ec.title_contains("百度")
print(current_title_contains(driver))
driver.get("Tencent 腾讯")
alert = ec.alert_is_present()
print(alert(driver))
10、定位一组元素:在定位单个元素的基础上element -> elements
11、多表单切换:因为Webdriver只能在一个页面上对元素进行识别和定位,因此在遇到frame/iframe对情况时,要通过switch_to.frame()方法将主体
切换为frame/iframe的内嵌页面:
# 定位iframe中的元素
driver.get("126网易免费邮--你的专业电子邮")
login_frame = driver.find_element_by_css_selector('iframe[id^="x-URS-iframe"]') # 在CSS定位中,可以用^=匹配以其为开头的元素
driver.switch_to.frame(login_frame)
account_input = driver.find_element(By.XPATH, "//input[@data-type = 'email' and @name = 'email']")
account_input.send_keys("guangtao.chen")
driver.switch_to.default_content # 切回到最外层的页面
12、多窗口切换:在页面操作时,在弹出的新窗口中进行识别和定位,就需要切换到新到窗口才能操作
current_window = driver.current_window_handle
login_btn = driver.find_element(By.CLASS_NAME, "s-top-login-btn")
login_btn.click()
sleep(1)
regist_btn = driver.find_element(By.CLASS_NAME, "pass-reglink")
regist_btn.click()
sleep(1)
windows = driver.window_handles
for handle in windows:
if handle != current_window:
driver.switch_to.window(handle)
account_input = driver.find_element(By.ID, "TANGRAM__PSP_4__userName")
account_input.send_keys("792607724")
13、警告框处理:
首先使用switch_to.alert()方法定位,然后使用如下方法进行操作:
a、text:返回alert、confirm、prompt中的文字信息
b、accept():接受现有警告框
c、dismiss():解散现有警告框
d、send_keys():在警告框中输入文本
14、下拉框处理:
# 非select下拉框定位:直接定位到下拉菜单,再对其中对元素定位
#以百度:设置->高级搜索->全部时间下拉框
settings_btn = driver.find_element(By.ID, "s-usersetting-top")
settings_btn.click()
sleep(1)
search_settings = driver.find_element(By.CLASS_NAME, "setpref")
search_settings.click()
sleep(1)
settings_Tabs = driver.find_element(By.XPATH, "//ul[@class = 'pftab_hd']")
advanced_search = settings_Tabs.find_element(By.XPATH, "//li[@data-tabid = 'advanced']")
advanced_search.click()
sleep(1)
whole_time_span = driver.find_element(By.ID, "adv-setting-gpc")
time_dropdown_list = whole_time_span.find_element(By.CLASS_NAME, "c-select-dropdown-list")
time_drop_list_items = time_dropdown_list.find_elements_by_class_name("c-select-item")
for item in time_drop_list_items:
print(item.get_attribute("textContent")) # 这边使用text打印不出,所以换成获取元素属性的textContent或innerText或innerHTML即可
print(item.get_attribute("innerText"))
print(item.get_attribute("innerHTML"))
# select下拉框定位:先定位到下拉框,再通过不同定位方式去定位元素
# 暂无实例
a、Select类:用于定位