Selenium3+python3自动化(三十一)--元素定位参数化(find_element)
前言
元素定位有八种方法,那么有没有一种方法,可以把八种定位合为一种呢?也就是把定位的方式参数化,如,id,name,css等设置为一个参数,这样只需维护定位方式的参数就行了。find_element()可以实现。
一、find_element()
1.selenium元素定位里面其实是有这个方法的,只是大部分时候都是结合By方法使用,如下图
# coding:utf-8
from selenium import webdriver
from selenium.webdriver.common.by import By
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
driver.find_element(By.ID,"kw").send_keys("xixi")
二、查看By方法源码
pycharm中,按住Ctrl,鼠标左键点击By
class By(object):
"""
Set of supported locator strategies.
"""
ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"
由源码可知,By.ID相当于是"id",那我们在请求时,可以直接使用"id"替换By.ID,这样也不用再导入By模块。
# coding:utf-8
from selenium import webdriver
# from selenium.webdriver.common.by import By
import time
driver=webdriver.Chrome()
driver.get("https://www.baidu.com")
# driver.find_element_by_id("kw").send_keys("xixi")
# time.sleep(2)
# driver.find_element(By.ID,"kw").send_keys("hehe")
# time.sleep(2)
driver.find_element("id","kw").send_keys("gege")
time.sleep(2)
driver.find_element("xpath","//span/input[@id='kw']").send_keys("good")
time.sleep(2)
#注意"link text"中间是空格
driver.find_element("link text","资讯").click()
time.sleep(2)
driver.find_element_by_link_text("新闻").click()
三、find_element和find_element_by_xxx的区别
1.pycharm中,导入相应的包,按照正常流程书写,输入driver.find_element(),按住Ctrl键,鼠标左键点击find_element,打开并跳转到源码页面;
2.输入driver.find_element_by_id(),按住Ctrl键,鼠标左键点击find_element_by_id,打开并跳转到源码页面;
3.查看源码,发现find_element_by_xxx的方法都是返回的find_element方法,也就是说那八个定位方法其实就是八个小分支。
def find_element(self, by=By.ID, value=None):
"""
Find an element given a By strategy and locator. Prefer the find_element_by_* methods when
possible.
:Usage:
element = driver.find_element(By.ID, 'foo')
:rtype: WebElement
"""
if self.w3c:
if by == By.ID:
by = By.CSS_SELECTOR
value = '[id="%s"]' % value
elif by == By.TAG_NAME:
by = By.CSS_SELECTOR
elif by == By.CLASS_NAME:
by = By.CSS_SELECTOR
value = ".%s" % value
elif by == By.NAME:
by = By.CSS_SELECTOR
value = '[name="%s"]' % value
return self.execute(Command.FIND_ELEMENT, {
'using': by,
'value': value})['value']
def find_element_by_id(self, id_):
"""Finds an element by id.
:Args:
- id\_ - The id of the element to be found.
:Returns:
- WebElement - the element if it was found
:Raises:
- NoSuchElementException - if the element wasn't found
:Usage:
element = driver.find_element_by_id('foo')
"""
return self.find_element(by=By.ID, value=id_)
越努力,越幸运!!!
good good study,day day up!!!
浙公网安备 33010602011771号