python+selenium-基础知识

请看连接https://www.cnblogs.com/fengyiru6369/p/7993366.htmlcss

 
1 # coding=utf-8
 2 from selenium import webdriver
 3 driver = webdriver.Firefox()
 4 driver.maximize_window ()
 5 driver.get("https://www.baidu.com")
 6 try:
 7     driver.find_element_by_id("kwf")
 8     print("id is find")
 9 except Exception as e:
10     print("exception find ",format(e))
11 driver.quit()
 

运行结果:html

注:该断言判断是否获取对应的元素,再自动化脚本执行时,能够定位出现的问题前端

2.利用link text定位元素

1 try:  
2     driver.find_element_by_link_text("新闻")  
3     print ('test pass: element found by link text')  
4 except Exception as e:  
5     print ("Exception found", format(e))

3.利用partial link text定位元素

try:  
    driver.find_element_by_partial_link_text("主页").click()  
    print ('test pass: element found by partial link text')  
except Exception as e:  
    print ("Exception found", format(e))

注:partial_link_text与link_text连接定位相似,partial link text就是选择这个元素的link text中一部分字段。web

例如:百度首页带连接文字为:“把百度设为主页”。编程

   为了更好的验证是否找到了“把百度添加到首页”这个元素,我在这个地方添加了一个click(),运行代码,能够看到确实点击了这个元素,表明找到了这个元素。浏览器

选择partial link text的时候,须要选择一个比较惟一的字段,来区分这个元素。post

4.利用class name定位元素

1 try:  
2     driver.find_element_by_class_name("s_ipt")  
3     print ('test pass: element found by class name')  
4 except Exception as e:  
5     print ("Exception found", format(e))

5.利用name定位元素

try:  
    driver.find_element_by_name("wd")  # 这里百度搜索输入框有name = 'wd'这个节点信息  
    print ('test pass: element found by name value')  
except Exception as e:  
    print ("Exception found", format(e))

6.利用css定位元素

参考:http://blog.csdn.net/u011541946/article/details/68927139测试

 

7.清楚文本信息

复制代码
1 # coding=utf-8
 2 from selenium import webdriver
 3 driver = webdriver.Firefox()
 4 driver.maximize_window ()
 5 driver.get("https://www.baidu.com")
 6 driver.find_element_by_id("kw").send_keys("Selenium")
 7 try:
 8     driver.find_element_by_id("kw").clear()
 9     driver.find_element_by_id ("kw1").send_keys ("Selenium")
10     print ('test pass: clean successful')
11 except Exception as e:
12     print ("Exception found", format(e))
13 driver.quit()
复制代码

8.基本页面操做方法

driver.refresh() # 刷新方法 refresh  网站

driver.back()  # 从百度新闻后退到百度首页  ui

driver.forward() # 百度首页前进到百度新闻 

print(driver.capabilities['version'])  # 打印浏览器version的值  

print (driver.current_url)  # current_url 方法能够获得当前页面的URL

print (driver.title)  # title方法能够获取当前页面的标题显示的字段

在浏览器中新开一个界面:

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 from selenium.webdriver.common.keys import Keys
 5 
 6 driver = webdriver.Firefox ()
 7 driver.maximize_window ()
 8 # driver.implicitly_wait (6)
 9 
10 driver.get ("http://www.baidu.com/")
11 time.sleep (1)
12 ele = driver.find_element_by_tag_name ('body').send_keys (Keys.CONTROL + 't')  # 触发ctrl + t 在浏览器中新开一个tab
13 time.sleep (1)
复制代码

8.点击单选按钮-Radio Button

 

勾选一个单选按钮,就是调用元素方法click()

咱们利用for语句遍历这两个单选按钮,依次点击他们。

 

 

复制代码
1 from selenium import webdriver
 2 import time
 3 driver = webdriver.Firefox ()
 4 driver.maximize_window ()
 5 driver.get ('http://news.baidu.com')
 6 # driver.implicitly_wait (8)
 7 print(driver.find_elements_by_xpath ("//*/input[@type='radio']"))
 8 for i in driver.find_elements_by_xpath ("//*/input[@type='radio']"):
 9     i.click ()
10     time.sleep (5)
复制代码

 9.获取元素页面上的文字

复制代码
1 # coding=utf-8  
 2 import time
 3 from selenium import webdriver
 4 from selenium.webdriver.common.keys import Keys
 5 
 6 driver = webdriver.Firefox ()
 7 driver.maximize_window ()
 8 # driver.implicitly_wait (6)
 9 
10 driver.get ("http://www.baidu.com/")
11 time.sleep (1)
12 driver.find_element_by_xpath ("//*[@id='u1']/a[7]").click ()
13 time.sleep (1)
14 
15 driver.find_element_by_xpath ("//*[@id='TANGRAM__PSP_10__submit']").click ()
16 
17 
18 # 断言方法二,本文重点介绍方法  
19 error_mes = driver.find_element_by_xpath ("//*[@id='TANGRAM__PSP_10__error']").text
20 print(error_mes)
21 try:
22     assert error_mes == u'请您填写手机/邮箱/用户名'
23     print ('Test pass.')
24 except Exception as e:
25     print ("Test fail.", format (e))
复制代码

注:不一样版本的火狐浏览器,定位的元素会有所不一样

10.验证控件是否选中

 

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox ()
 6 driver.maximize_window ()
 7 # driver.implicitly_wait (6)
 8 driver.get ("http://news.baidu.com/")
 9 time.sleep (1)aluse
10 try:
11     # driver.find_element_by_xpath ("//*[@id='news']").is_selected ()
12     assert driver.find_element_by_xpath ("//*[@id='newstitle']").is_selected () == True
13     print ('Test Pass.')
14 except Exception as e:
15     print ('Test fail', format (e))
复制代码

总结:

元素方法is_selected()返回是是布尔值(True  /Faluse),用来判断单选或者多选控件是否被选中,或者下拉选择菜单是否选择一个默认的option,均可以经过这个方法去判断。

11.获取页面元素的大小

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox ()
 6 driver.maximize_window ()
 7 # driver.implicitly_wait (6)
 8 driver.get ("http://baidu.com/")
 9 time.sleep (1)
10 Size = driver.find_element_by_id("su")
11 print(Size.size)
复制代码

 12.多窗口之间的切换

场景:在页面A点击一个链接,会触发在新Tab或者新窗口打开页面B,因为以前的driver实例对象在页面A,可是你接下来的脚本是操做页面B的元素,这样就形成了找不到元素的报错。原本介绍selenium中switch_to.window()方法来处理这个问题。

测试场景:打开百度新闻(页面A),点击热点新闻中第一个新闻连接(通常是国家领导人的新闻),会在第二个窗口打开这个新闻的具体详情页(页面B),测试须要去判断你点击这个这个新闻,在打开的详情页是否正确。

问题拆分:

1. 咱们已经知道switch_to.window()方法能够处理窗口切换的问题

2. 在页面A跳转到页面B以前,咱们须要用一个变量保存这个新闻的标题

3. 切换到页面B后,咱们获取这个新闻标题,而后和前面这个变量保存的值去对比,若是相等,那么就测试经过。

咱们分两个步骤去解答这个测试需求:

1. 先实现页面A切换到页面B

2. 页面A和页面B两个新闻标题进行对比

先看看窗口切换的脚本代码:

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox ()
 6 driver.maximize_window ()
 7 driver.get ('http://news.baidu.com')
 8 time.sleep (3)
 9 
10 driver.find_element_by_xpath ("//*[@id='pane-news']/div/ul/li[1]/strong/a").click ()
11 time.sleep (3)
12 print (driver.current_window_handle)  # 输出当前窗口句柄
13 handles = driver.window_handles  # 获取当前所有窗口句柄集合
14 print (handles)  # 输出句柄集合
15 
16 for handle in handles:  # 切换窗口
17     print(handle)
18     if handle != driver.current_window_handle:
19         print(handle)
20         print ('switch to second window', handle)
21         driver.close ()  # 关闭第一个窗口
22         driver.switch_to.window (handle)  # 切换到第二个窗口
23         print(handle)
复制代码

注:经过driver.current_window_handle获取的当前窗口句柄,不管打开多少个窗口,只要不使用driver.switch_to.window()就是第一次打开的窗口。

使用driver.window_handles获取的窗口为当前打开的全部窗口。

只有driver.switch_to.window()才能切换到对应的窗口,获取窗口句柄。

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 # driver = webdriver.Chrome()
 6 driver = webdriver.Firefox()
 7 # driver.maximize_window ()
 8 driver.get ('http://news.baidu.com')
 9 time.sleep (1)
10 
11 news_link = driver.find_element_by_xpath ("//*[@id='pane-news']/div/ul/li[1]/strong/a")
12 page1_title_string = news_link.text  # 获得页面A新闻标题
13 print(page1_title_string)
14 news_link.click ()  # 点击新闻连接
15 time.sleep (1)
16 handles = driver.window_handles
17 
18 for handle in handles:  # 切换窗口(切换到搜狗)
19     if handle != driver.current_window_handle:
20         print( 'switch to second window', handle)
21         driver.close ()  # 关闭第一个窗口
22         driver.switch_to.window (handle)  # 切换到第二个窗口
23 page2_title_string = driver.find_element_by_xpath ("/html/body/div[2]/div[2]/div[4]/div[2]/div/div[1]").text
24 
25 print(page2_title_string)
26 # 详情页有一个原标题
27 
28 try:
29     assert page1_title_string in page2_title_string  # 判断页面B标题是否包含页面A标题
30     print ('Test Pass.')
31 except Exception as e:
32     print ('Test Fail')
复制代码

注:

1.通常编程的过程当中,要提早设置浏览器最大化,不要使用drive.maxisize_window()去设置窗口的大小。否者当浏览器窗口最大时,使用该方法浏览器就会变成最小,致使有些元素经过xpath定位失效。

2网页的title与新闻详情页的title是不同的概念,前者经过driver.title便可获取,后者经过元素定位获取。

13.处理iframe切换

问题:发现元素定位没问题,在测试回放的过程,发现就是找不到元素报错。

因为没有找到合适的iframe网站,这里很差用代码举例,简单文字加图片来介绍。

1 driver.switch_to.frame("iframe1")  
2 # 操做目标元素,这个目标元素在 iframe1里面,这里就是百度文本输入框输入文字  
3 driver.switch_to.default_content()

14.处理alert弹框

1 driver.switch_to_alert().accept()  # 点击弹出里面的肯定按钮  
2 #driver.switch_to_alert().dismiss() # 点击弹出上面的X按钮

15.获取当前页面的所有图片信息

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Chrome ()
 6 driver.maximize_window ()
 7 driver.implicitly_wait (6)
 8 driver.get ("http://news.baidu.com")
 9 time.sleep (1)
10 print(driver.find_elements_by_tag_name ("img"))
11 for image in driver.find_elements_by_tag_name ("img"):
12     print (image.text)
13     print (image.size)
14     print (image.tag_name)
复制代码

 

 运行结果:

运行结果,发现没有图片名称打印出来,说明百度新闻页面,全部图片都没有给出text这个属性,前端的妹子没有写图片的text属性

 16.获取页面元素的herf属性

经过Selenium获取页面元素的某一个属性。一个元素可能有多个属性,例如 class, id, name, text, href, vale等等。这里咱们举例一个爬虫中常常须要处理的连接问题:找出当前页面全部的超连接。

已百度首页为例,打印全部包含href的元素的连接

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox()
 6 driver.maximize_window()
 7 # driver.implicitly_wait(6)
 8 driver.get("https://www.baidu.com")
 9 time.sleep(1)
10 print(driver.find_elements_by_xpath("//*[@href]"))
11 for link in driver.find_elements_by_xpath("//*[@href]"):
12     print(link)
13     print(link.get_attribute('href'))
14 driver.quit()
复制代码

17.如何截图并保存

复制代码
1 # coding=utf-8
 2 import time
 3 from selenium import webdriver
 4 
 5 driver = webdriver.Firefox()
 6 driver.maximize_window()
 7 
 8 driver.get("https://www.baidu.com")
 9 time.sleep(1)
10 
11 driver.get_screenshot_as_file("‪C:\\Users\\fyr\\Desktop\\新建文本文档 11(2).png")
12 time.sleep(4)
13 driver.quit()
相关文章
相关标签/搜索