4 元素的定位(重点)

我们在做手动测试的时候通过眼睛看然后用手操作鼠标点击相应的按钮,但是如何让电脑自动找到相应的按钮呢?这里selenium2给我们提供了若干种找到指定元素的方法

1.元素定位方法的分类
  • driver.find_element_by_XXX()
    from selenium import webdriver            # 倒包    
    import time
    driver = webdriver.Firefox()            # 创建浏览器对象
    driver.get('http://www.baidu.com')        # 访问百度
    el = driver.find_element_by_id('kw')    # 找到搜索输入框    
    el.send_keys('传智测试学科第一期')            # 输入关键词
    time.sleep(5)
    driver.close()
    
  • By的形式(了解,以后遇见知道是个啥东西就行)
    from selenium import webdriver
    from selenium.webdriver.common.by import By
    import time
    driver = webdriver.Firefox()            # 创建浏览器对象
    driver.get('http://www.baidu.com')        # 访问百度
    el = driver.find_element(By.ID,'kw')    # 找到搜索输入框    
    el.send_keys('传智测试学科第一期')            # 输入关键词
    time.sleep(5)
    driver.close()
    
2.元素定位的8种方式
Selenium提供了8种定位方式。
id id定位
name name属性值定位
class name 伪类名定位
tag name 标签名定位
link text 链接文本定位
partial link text 部分链接文本
xpath xpath路径表达式
css selector css选择器定位
对应的API
通过xpath定位在豆瓣电影页面定位到全部正在热映,并点击
from selenium import webdriver
import time
driver = webdriver.Firefox()

url = 'https://movie.douban.com/'
driver.get(url)

# 通过xpath定位到全部正在热映,并点击
el = driver.find_element_by_xpath('/html/body/div[3]/div[1]/div/div[2]/div[2]/div[1]/h2/span[1]/a')
el.click()

time.sleep(5)
driver.quit()
通过css_selector定位到天猫首页上的天猫国际,并点击
from selenium import webdriver
import time

driver = webdriver.Firefox()

url = 'https://www.tmall.com/'
driver.get(url)

# 通过css选择器定位到天猫国际元素,并点击
el = driver.find_element_by_css_selector('.inner-con2 > a:nth-child(2) > img:nth-child(1)')
el.click()
time.sleep(5)

driver.quit()
通过标签属性id对应的值来进行元素定位,id值唯一,但并非所有的元素都有id属性
from selenium import webdriver
import time

driver = webdriver.Firefox()

# 请求去哪网首页
url = 'https://www.qunar.com/'
driver.get(url)

# 定位到攻略,并且点击进入
el_1 = driver.find_element_by_id('__link_travel__')
el_1.click()
print('进入到攻略')
time.sleep(5)
# 定位到公寓,并且点击进入
el_1 = driver.find_element_by_id('__link_gongyu__')
el_1.click()
print('进入到公寓')


time.sleep(5)
driver.close()
通过name定位(人人登录)
from selenium import webdriver
import time
driver = webdriver.Firefox()

url = 'http://www.renren.com/'
driver.get(url)

# 定位到账号输入框,并且输入
el_user = driver.find_element_by_name('email')
el_user.send_keys('***********')

# 定位到密码输入框,并输入
el_pwd = driver.find_element_by_name('password')
el_pwd.send_keys('**********')

el_sub = driver.find_element_by_id('login')
el_sub.click()

time.sleep(5)
driver.quit()
通过class name定位(斗鱼直播翻页)
from selenium import webdriver
import time

# 创建浏览器对象
driver = webdriver.Firefox()
# 请求斗鱼站点
url = 'https://www.douyu.com/directory/all'
driver.get(url)

while True:
    try:
        # 定位到翻页按钮
        el_sub = driver.find_element_by_class_name('shark-pager-next')
        el_sub.click()
        # 等待一定时间
        time.sleep(5)
    except Exception as e:
        break

driver.close()
通过tag name定位(bing搜索)
from selenium import webdriver
import time

driver = webdriver.Firefox()

url = 'https://cn.bing.com/'
driver.get(url)

# 通过标签名定位元素,要么标签名唯一,要么是众多中的第一个,定位到输入用的input标签
el_1 = driver.find_element_by_tag_name('input')
el_1.send_keys('selenium')

# 通过id定位到搜索按钮
el_sub = driver.find_element_by_id('sb_form_go')
el_sub.click()

time.sleep(5)
driver.close()
from selenium import webdriver

driver = webdriver.Firefox()
import time

# 访问北京58
url = 'http://bj.58.com/'
driver.get(url)

el = driver.find_element_by_link_text('房屋出租')
el.click()

time.sleep(5)

# 关闭一个窗口
driver.close()
from selenium import webdriver
import time


driver = webdriver.Firefox()

url = 'http://www.baidu.com'
driver.get(url)

# 定位到新闻,并点击进入百度新闻
el = driver.find_element_by_link_text('新闻')
el.click()
time.sleep(3)

# 后退
print('当前url:', driver.current_url)
driver.back()
time.sleep(3)

# 定位到好123,并点击进入
el_1 = driver.find_element_by_partial_link_text('123')
el_1.click()
time.sleep(3)

# 退出
driver.close()
3.定位一组元素
定位一组元素的方法同样也是八种,只是在上面api的基础上稍加改动,结果为一个列表
    driver.find_elements_by_xpath()
    driver.find_elements_by_css_selector()
    driver.find_elements_by_css_id()
    driver.find_elements_by_name()
    driver.find_elements_by_tag_name()
    driver.find_elements_by_class_name()
    driver.find_elements_by_link_text()
    driver.find_elements_by_partial_link_text()
练习案例1
from selenium import webdriver
import time
driver = webdriver.Firefox()

url = 'http://www.baidu.com'
driver.get(url)

el = driver.find_element_by_class_name('s_ipt')
print(el)
el.send_keys('selenium')

el_sub = driver.find_element_by_class_name('s_btn')
el_sub.click()

# 定位搜索结果元素列表
results = driver.find_elements_by_class_name('c-container')
print(results)
print(len(results))


time.sleep(7)
driver.close()
from selenium import webdriver

driver = webdriver.Firefox()

# 访问58租房
url = 'http://bj.58.com/chuzu/?PGTID=0d100000-0000-1419-2f7b-56d345f4bf65&ClickID=1'
driver.get(url)

# 定位到所有的房源列表
results = driver.find_elements_by_css_selector('li[sortid]')
for i in results:
    print (i)
print(results)


driver.close()