您好,欢迎来到宝玛科技网。
搜索
您的当前位置:首页初识selenium(4)——常见元素定位

初识selenium(4)——常见元素定位

来源:宝玛科技网

selenium中常见元素定位

1.判断页面是否正确

打开页面查找元素,判断页面是否正确
driver.title() 获取页面title
ES.title_is() 包含title,判断title是否正确
river.current_url 获取当前页面的url

#coding=utf-8
from selenium import webdriver
from selenium.webdriver.support import expected_conditions as EC
import time


driver=webdriver.Chrome()
driver.get('https://www.imooc.com/')
title_name=driver.title
#判断页面是否调用正确
if '慕课网' in title_name:
    print("打开正确")
else:
    print("打开失败")
#打印判断结果(完全判断)
titl_a=EC.title_is("慕课网")
print(titl_a(driver))
#打印判断结果(模糊判断)
title=EC.title_contains("慕课网")
print(title(driver))

driver.close()

运行结果

2.多窗口切换

获取所有页面句柄:
driver.window_handles
获取当前页面句柄:
driver.current_window_handles

#coding=utf-8
from selenium import webdriver
import time
from selenium.webdriver.support import expected_conditions as ES
driver=webdriver.Chrome()
driver.get('https://www.imooc.com/user/newlogin')
#传入数据至对应元素中
driver.find_element_by_name('email').send_keys('xxxx')
driver.find_element_by_name('password').send_keys('xxx')
#点击对应元素
driver.find_element_by_class_name('moco-btn').click()
time.sleep(5)
driver.get('https://www.imooc.com/user/setbindsns')
#搞活动时的小窗口关闭处理,双十一活动的弹窗好心累
try:
    driver.find_element_by_class_name('close-btn').click()
except:
    print('没有该页面')
driver.find_element_by_class_name('inner-i-box').find_element_by_class_name('moco-btn-normal').click()
#由于要定位的classname可能其他元素也有,故先用elements定位有几个相同class name的div,在定位至第几个,然后再定位下一级
# element定位元素时,是某一个元素,当多个相同时,默认第一个;elements定位元素时,是一个元素集,当多个相同时,按照位置排序
driver.find_elements_by_class_name('inner-i-box')[1].find_element_by_class_name('moco-btn-normal').click()
#获取所有页面
handl_list=driver.window_handles
#获取当前页面
current_list=driver.current_window_handle
print(handl_list)
time.sleep(15)
for i in handl_list:
    if i!=current_list: #如果获取到的句柄不等于当前句柄
        time.sleep(5)
        driver.switch_to.window(i)#切换当前窗口
        ti=ES.title_contains("网站连接")
        if ti(driver)==True:#判断页面是否正确,正确停止循环,错误继续循环
            break#停止循环
time.sleep(5)
#默认二维码的小窗口关闭处理,这种弹窗好心累
try:
    driver.find_element_by_id('jump_login_url_a').click()
    time.sleep(5)
except:
    print('没有该页面')
#获取到正确的页面后传入对应的参数
driver.find_element_by_id('username').send_keys('xxx')
driver.find_element_by_id('password').send_keys('xxx')
#点击登录,因为是弹的是微博的界面,所以直接定位登录那一级是不行(driver.find_element_by_class_name('W_btn_a btn_34px').click(),会报错),需用上一层的div
driver.find_elements_by_class_name('btn_mod')[1].click()
time.sleep(5)
#关闭窗口
driver.close()

3.元素基础定位

find_element_by_name
  1. 通过class来定位:
find_element_by_class_name
  1. 通过id来定位:(id具有唯一性)
find_element_by_id()
  1. 通过tag定位:(tag是用来定义功能的,即div、input、a等都可以表示为tag,故实际中很少用到且容易出错)
find_element_by_tag_name()
  1. 通过link定位(主要用来定义链接)

find_element_by_link_text() (完全匹配)
find_element_by_partial_link_text()(模糊匹配)

  1. 自定义一个定位方法
    def find_element_by_id(self,value):
        base_url = self.driver + '/element'
        data = json.dumps(
            {
                "using": 'name',
                "value":value
            }
        )
        res=requests.post(base_url, data).json()
        print(res)

具体测试使用为:

    def find_element_by_id(self,value):
        base_url = self.driver + '/element'
        data = json.dumps(
            {
                "using": 'name',
                "value":value
            }
        )
        res=requests.post(base_url, data).json()['value']
        #element
        print(res)
        return res

#请求的地址
if __name__=='__main__':
     requests_driver=requests_webdrier()
     requests_driver.get_url('https://www.imooc.com/user/newlogin')
     requests_driver.find_element_by_id('email')

前面部分的代码为
运行成功,后台打印如下

4.模态框及焦点定位

模态框定位的过程中保证元素定位的唯一性
焦点定位:switch_to.active_element(老版本用的是switch_to_active_element)

#coding=utf-8
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('https://www.imooc.com/')
driver.find_element_by_id('js-signin-btn').click()
time.sleep(5)
#传入数据至对应元素中
driver.find_element_by_name('email').send_keys('xxx')
driver.find_element_by_name('password').send_keys('xxx')
#模态框定位
driver.find_element_by_class_name('moco-btn-lg').click()
time.sleep(5)
driver.get("https://coding.imooc.com/class/303.html")
driver.maximize_window()
driver.find_element_by_link_text("加购物车").click()
time.sleep(2)
#模态框定位
driver.find_element_by_class_name('js-btn-close' ).click()
time.sleep(2)
driver.get('https://coding.imooc.com/learn/addquestion?cid=299&content=#')
#焦点定位#注意:过去版本的播放层(鼠标自动定位到里面)的添加焦点是switch_to.active_element().send_keys('test'),这个用法新版已删除,故使用的是switch_to.active_element.send_keys('test ')
driver.switch_to.active_element.send_keys('test')
time.sleep(5)
driver.close()` 

5.CSS定位

find_element_by_css_selector()
用标签:(input) id:(#) class:(.)进行多层定位

#coding=utf-8
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('https://www.imooc.com/')
driver.find_element_by_id('js-signin-btn').click()
time.sleep(5)
#传入数据至对应元素中
driver.find_element_by_name('email').send_keys('xxxx')
driver.find_element_by_name('password').send_keys('xxxx')
# driver.find_element_by_class_name('moco-btn-lg').click()
#CSS定位
driver.find_element_by_css_selector(".rlf-group>.moco-btn").click()
time.sleep(5)
driver.close()

6.xpath定位

xpath可以通过兄弟节点、祖孙节点来间接定位,应尽量选取变化量少的节点
兄节点:preceding-sibliding::
弟节点:following-sibliding::
父节点:parent::

#coding=utf-8
from selenium import webdriver
import time
driver=webdriver.Chrome()
driver.get('https://www.imooc.com/')
driver.find_element_by_id('js-signin-btn').click()
time.sleep(5)
#传入数据至对应元素中
driver.find_element_by_name('email').send_keys('xxxx@qq.com')
driver.find_element_by_name('password').send_keys('xxx')
driver.find_element_by_xpath('//*[@id="signup-form"]/div[5]/input')
time.sleep(5)
driver.close()

扩展:
浏览器如何通过开发者模式快速该元素的xpath位置
F12打开开发者模式,选中元素对应的HTML语句,点击鼠标右键,copy->copy xpath,然后直接可以粘贴至代码中

因篇幅问题不能全部显示,请点此查看更多更全内容

Copyright © 2019- baomayou.com 版权所有 赣ICP备2024042794号-6

违法及侵权请联系:TEL:199 18 7713 E-MAIL:2724546146@qq.com

本站由北京市万商天勤律师事务所王兴未律师提供法律服务