Python+Selenium 定位元素

1、摘取网页上所有邮箱

练习场景:在某一个网页上有些字段是我们感兴趣的,我们希望摘取出来,进行其他操作。但是这些字段可能在一个网页的不同地方。例如,我们需要在关于百度页面-联系我们,摘取全部的邮箱。

思路拆分:

1. 首先,需要得到当前页面的source内容,就像,打开一个页面,右键-查看页面源代码。

2. 找出规律,通过正则表达式去摘取匹配的字段,存储到一个字典或者列表。

3. 循环打印字典或列表中内容,Python中用 for 语句实现。

技术角度实现相关方法:

1. 查看页面的源代码,在Selenium中有driver.page_source 这个方法得到

2. Python中利用正则,需要导入re模块

3. for email in emails :

          print email


 

# coding=utf-8
 
from selenium import webdriver
import re
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("http://home.baidu.com/contact.html")
# 得到页面源代码
doc = driver.page_source
emails = re.findall(r'[\w]+@[\w\.-]+',doc) # 利用正则,找出 [email protected] 的字段,保存到emails列表
# 循环打印匹配的邮箱
for email in emails:
    print (email)

2、利用ID定位元素

本篇介绍如何通过元素节点信息ID来定位该元素,使用id来定位元素虽然效率要高于XPath,但是实际测试测项目,能直接通过id定位的元素还是比较少,以下来举例百度首页搜索输入框的id定位。

# coding=utf-8
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("https://www.baidu.com")
try:
    driver.find_element_by_id("kw")
    print ('test pass: ID found')  
except Exception as e:
    print ("Exception found", format(e))
 
driver.quit()

这里,我们通过try except语句块来进行测试断言,这个在实际自动化测试脚本开发中,经常要用到处理异常。本文,我们学习了可以利用find_element_by_id()方法来定位网页元素对象。

3、利用tag name定位元素

 前一篇文章介绍了如何通过元素的id值来定位web元素,本文介绍如何通过tag name来定位元素。个人认为,通过tag name来定位还是有很大缺陷,定位不够精确。主要是tag name有很多重复的,造成了选择tag name来定位页面元素不准确,所以使用这个方法定位web元素的机会很少。

     

# coding=utf-8
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("https://www.baidu.com")
try:
    driver.find_element_by_tag_name("form")
    print ('test pass: tag name found')
except Exception as e:
    print ("Exception found", format(e))
 
driver.quit()

4、利用link_text定位元素

      本文介绍如何通过link text 来定位页面元素,我们打开网页,一些可以点击的链接跳转上面的文字,就是link text,用百度首页举例来看:

在上面图中,这一排上面的文字都是link text,例如我们要通过“新闻”这个文本字段来定义这个跳转链接元素。

# coding=utf-8
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("https://www.baidu.com")
try:
    driver.find_element_by_link_text("新闻")
    print ('test pass: element found by link text')
except Exception as e:
    print ("Exception found", format(e))
 
driver.quit()

5、利用partial link text定位元素

本文介绍如何通过partial link text来定位页面元素。看到这个,有点和前一篇文字link text有点类似。字面意思,确实和link text相类似,partial link text就是选择这个元素的link text中一部分字段。

      还是用百度首页输入框下有一个添加首页“把百度设为主页”。

相关脚本如下:
 

# coding=utf-8
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("https://www.baidu.com")
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))
 
driver.quit()

6、利用class name定位元素

有时候,我们在用firepath(不会的请点这里)查看元素的XPath信息,发现没有可以用来定位的id信息,这个时候我们就需要考虑用其他的可用的来定位元素。本文介绍如何通过元素节点中class name的值来定位页面元素。还是以百度首页,搜索输入框定位举例:

XPath截图

# coding=utf-8
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("https://www.baidu.com")
try:
    driver.find_element_by_class_name("s_ipt")
    print ('test pass: element found by class name')
except Exception as e:
    print ("Exception found", format(e))
 
driver.quit()

7、利用name定位元素

本文介绍如何通过节点中name的值来定位这个web元素。还是来看百度首页搜索输入框,通过name的值来定位。

# coding=utf-8
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("https://www.baidu.com")
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))
 
driver.quit()

8、利用css定位元素

前面介绍了,XPath, id , class , link text, partial link text, tag name, name 七大元素定位方法,本文介绍webdriver支持的最后一个方法:by_css。css和XPath类似,也需要掌握一些语法,才能写出正确的,完整的css选择表达式。
 

# coding=utf-8
 
from selenium import webdriver
 
driver = webdriver.Chrome()
driver.maximize_window()
driver.implicitly_wait(6)
 
driver.get("https://www.baidu.com")
try:
    driver.find_element_by_css_selector("#su") # 找 百度一下 这个按钮
    print ('test pass: element found by css selector')
except Exception as e:
    print ("Exception found", format(e))
 
driver.quit()

猜你喜欢

转载自blog.csdn.net/lupa1521/article/details/89212326