一.四种一般元素定位的方法
1.driver.find_element(By.TAG_NAME,'要定位的属性值')
2.driver.find_element(By.NAME,'要定位的属性值')——常用
3.driver.find_element(By.ID,'要定位的属性值')——常用
4.dirver.find_element(By.CLASS_NAME,‘要定位的属性值’)——常用
二.两种定位链接元素的方法
1.driver.find_element(By.LINK_TEXT,'链接里边的文本')——常用
2.driver.find_element(By.PARTIAL_LINK_TEXT,'链接里边的文本')
三.两种灵活定位元素的方法
1.driver.find_element(By.CSS_SELECTOR,'该段元素的样式')——常用
2.driver.find_element(By.XPATH,‘该段元素的XPATH’)——常用
(XPATH定位元素在firefox浏览器中有个插件叫try xpath可以辅助使用)
注意:以上方法都只适用于selenium3。
四.三种对元素的基本操作
1.send_keys('需要输入的内容')。——在元素中输入内容
比如:driver.find_element(By,ID,'kw').send_keys('我是帅哥')
2.click()。——点击该元素
比如:driver.find_element(By,ID,'kw').click()
3.clear()。——清除元素里边的内容
比如:driver.find_element(By,ID,'kw').clear()
五.定位同属性的多个元素
1.driver.find_elements——其余同一般八种定位方式,只是在定位到指定的属性后可能有多个元素。这时需要做的是区分这些元素。此时得到的是一个列表,那么就用列表的形式定位到指定的元素。比如:a = driver.find_elements(By.ID,'kw'),如果此时有三个ID为'kw'的,那么现在我要对第二个元素进行点击操作,就用a[1].click()。
六.用属性来判断定位的元素是否正确(可以视为断言)
1.get.attribute('属性的名称')——可以得到该属性的属性值,那么可以通过该属性值,做一个判断。比如:a = driver.find_elements(By.ID,'kw'),b = a.get.attribute('class'),假如此时class的值为“s_ipt”,那么就可以做个判断,
if b == 's_ipt':
print('属性正确')
else:
print('属性不正确')
2.text——获取元素文本(不是所有元素都有文本)。比如:a = driver.find_elements(By.ID,'kw'),b = a.text,假如此时定位到的文本为'我是帅哥',那么就可以做个判断,
if b == '我是帅哥'
print('文本正确')
else:
print('文本错误')
七.对浏览器的操作
1.sleep()——等待时间。有别于implicitly_wait,具体区别自己查一下。sleep需要调用,比如:from time import sleep,然后就可以直接使用sleep(3),表示的是,等待3秒。
2.back()——在浏览器中返回上一操作(后退)。使用时直接使用driver.back()
3.forward()——在浏览器中前进到刚才的操作(前进)。使用时直接使用driver.forward()。
4.refresh()——刷新当前页面。使用时直接使用driver.refresh()
5.minimize_window()——最小化浏览器窗口。使用时直接使用driver.minimize_window()
6.maximize_window()——最大化浏览器窗口。使用时直接使用driver.maximize_window()
7.fullscreen_winow()——全屏化浏览器窗口。使用时直接使用driver.fullscreen_window()
8.close()——关闭当前操作的窗口。有别于quit(),具体区别自己查一下。使用时直接使用driver.close()
注意:2、3、4相当于UI界面下浏览器左上方的三个按钮。5、6、7、8相当于UI界面下浏览器有上方的几个按钮。
八.获取页面的属性
1.current_url——获取当前页面的url,也可以用来进行断言,断言的实际运用也是做判断。使用时driver.current_url。比如:a = driver.current_url,如果此时url为'www.baidu.com'
if a == 'www.baidu.com'
print('页面正确')
else:
print('页面不正确')
2.title——获取当前页面的标题,也可以用来进行断言,断言的实际运用也是做判断。使用时driver.title。例子同current_url。
3.page_sourse——获取页面源代码,也可以用来进行断言,断言的实际运用也是做判断。使用时driver.page_sourse。例子同current_url。只不过在if 这里用 in。比如:if '我是帅哥' in sourse:
九.js弹窗警告
1.switch_to.alert.accept()——切换到警告框,同时点击警告框中的'确定'。使用该指令driver.switch_to.alert.accept()。
2.switch_to.alert.dismiss()——切换到警告框,同时点击警告框中的'取消'。使用该命令driver.switch_to.alert.dismiss()。
3.switch_to.alert.text——切换到警告框,同时获取警告信息。使用该指令driver.switch_to.alert.text()。
十.操作下拉列表
1.Select().select_by_index()——首先要导入select包才能使用select的指令,用alt+enter就可以导包。Select()括号里边填写指定的元素。在index的括号里边填写的是下拉框的个数的序号,比如下拉框有如下选项:重庆,成都,武汉。那么他的序号就是0,1,2。如果我要选成都,那么就可以写成:index(1)。
而下拉框的指令使用是这样的:
先定位元素 a = driver.find_element(By.ID,'kw')
再使用下拉指令Select(a).select_by_index(1)
注意:但是很遗憾的是这个指令很少使用。
2.Select().select_by_value()——同样的要先导包,Select里边填的也是指定元素,value()里边填写的是下拉框里边的值对应的value值。比如:a = driver.find_element(By.ID,'kw')
<option value="01">我是帅哥</option>
<option value="02">你是帅哥</option>
<option value="03">他是帅哥</option>
value()括号里边就可以填写"01","02","03"
所以,他的格式就是:Select(a).select_by_value("02")
注意:这个指令常用
3.Select().select_by_visible_text()。其他都和前边相同,text()括号里边填写的是文本内容。还是以上边的例子:a = driver.find_element(By.ID,'kw')
<option value="01">我是帅哥</option>
<option value="02">你是帅哥</option>
<option value="03">他是帅哥</option>
此时text()里边可以填写:"我是帅哥","你是帅哥","他是帅哥"
所以,格式是:Select(a).select_by_visible_text("我是帅哥")
十一.切换窗口
1.a = driver.window_handles
driver.switch_to.window(a[1])
详情可见我另一篇文章——《python用selenium编写时如何操作新窗口》
十二.切换框架
1.常遇到定位不到元素的原因:定位指令不对,元素有重复导致指令使用错误,还有一种就是元素在iframe框架里边必须先切换到该框架处才能定位下边的元素。
2.driver.switch_to.frame()——frame()括号内填写的就是iframe里边的属性值,作用是切换框架到指定的iframe当中,然后就可以对iframe里边的元素进行定位,相当于switch_to.window()。比如:
如上图,可以看到属性值有:login_frame。所以可以有指令:
a = driver.find.element(By.ID,'login_frame')
driver.switch_to.frame(a)
经过以上的指令,就可以对iframe下边的元素进行定位了。
十三.隐式等待
1.driver.implicitly_wait()——括号里边填时间,有别于sleep(),就算是元素定位失败,也还可以继续查找元素,直到到指定的时间为止,然后才报错。同时只要指定一次,就能全局生效,相当于全局变量。
十四.模拟鼠标操作
1.ActionChains(),创建一个动作类的对象,括号里边填写就是driver对象,当然在测试框架中填写的就是self.driver这个对象。
2.ActionChains().move_to_element().perform()——模拟鼠标移动到某个元素上,其中element()括号里边填写的就是定位的元素,perform()括号里边不指定任何参数。比如:
a = driver.find.element(By.ID,'login_frame')
ActionChains(driver).move_to_element(a).perform()
这里表示的就是把鼠标移动到元素a上
3.ActionChains().double_click().perform()——模拟鼠标双击某个元素,括号内的参数同上。
4.ActionChains().context_click().perform()——模拟鼠标右键单击某个元素,括号内得参数同上。
十五.测试框架
1.测试框架基本格式:
from selenium import webdriver
import unittest
class demo(unittest.TestCase):
def setUp(self) ->None:
self.driver = webdriver.Firefox()
self.driver.implicitly_wait(10)
def tearDown ->None:
self.driver.quit()
def test_01_demo(self):
测试用例一(可以写定位元素,对网页的操作)。注意:里边的使用driver都必须为self.driver,当然也可以给self.driver赋值,比如:driver = self.driver。那么后边就可以使用driver了。
def test_02_demo(self):
测试用例二(可以写定位元素,对网页的操作)
......
if__name__="__main__":
unittest.main()
说明:其实以上相当于就是个固定的格式,如果还需要什么包也可以直接导就行了,比如sleep包等。"->None"是pycharm自动生成的,可有可无。千万要记得在测试框架中就不能单独使用driver指令了,必须使用self.driver,当然除非重新给self.driver赋值,就像上边写的,我就个self.driver赋值成driver,这个时候后边才可以直接使用driver。在测试用例里边写的就是前边一到十四总结的对网页进行的自动化操作。
十六.断言
1.self.assertEqual(预期结果,实际结果)——写在test_01_demo(self):这些用例里边。判断预期结果和实际结果是否相同。比如:
self.assertEqual('https://www.baidu.com',driver.current_url)
表示的就是此时我的预期结果是'https://www.baidu.com'。而实际结果是查出来的url。如果相同则成功,如果不同则不成功。
2.self.assertIn(预期结果,实际结果)——判断预期结果是否在实际结果里边。比如:
self.assertIn('hao123',driver.page_source)
表示的就是此时'hao123'在该网页的资源或者链接里边。
十七.XPATH可以手写
1."//*[@属性='属性值']"
后记:至此selenium的基本操作就总结完成,以上内容如果都会了,那么就掌握了selenium常见的操作了。