find_element[python]
在python里面,webdriver提供find_element()/find_elements方法定位元素,前者返回一个元素,后者返回多个元素。其参数为(by,value),by是定位方式,value是对应的值。
find_element源码如下:
def find_element(self, by=By.ID, value=None):
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']
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"
8种定位方式
通过python源码,我们可以分析出selenium提供的各种定位方式。
总共有8种定位方式:
| 方式名称 | 对应属性 | 说明 | |
|---|---|---|---|
| ID | id | 元素的id属性,一般都是唯一的 | |
| NAME | name | 元素的name属性,一般都是唯一的 | |
| XPATH | xpath | 用页面中元素的路径进行查找,几乎能定位到所有元素,但是查找较慢 | |
| TAG_NAME | tag name | 通过元素的标签名称进行查找,一般会找到多个,结合find_elements使用 | |
| CLASS_NAME | class name | 使用元素的css样式的class name查找 | |
| CSS_SELECTOR | css selector | 通过css样式选择器进行定位,这种定位非常快速 | |
| LINK_TEXT | link text | 通过链接的文本进行定位,文本全匹配查找 | |
| PARTIAL_LINK_TEXT | partial link text | 通过链接的文本进行定位,模糊查找 |
实例
以百度首页为例:以下是页面源码
搜索输入框:
<input id="kw" name="wd" class="s_ipt" value="" maxlength="255" autocomplete="off">
百度一下的按钮:
<input type="submit" id="su" value="百度一下" class="bg s_btn">
新闻的链接:
<a href="http://news.baidu.com" target="_blank" class="mnav c-font-normal c-color-t">新闻</a>
实例脚本代码:
from selenium.webdriver import Chrome
from selenium.webdriver.common.by import By
class TestLocat():
def setup_class(self):
self.driver=Chrome()
self.driver.implicitly_wait(3)
def setup(self):
self.driver.get("https://www.baidu.com")
def teardown_class(self):
self.driver.quit()
def test_id(self):
self.driver.find_element(By.ID,"kw").send_keys("百度")
self.driver.find_element_by_id("su").click()
def test_name(self):
self.driver.find_element(By.NAME,"wd").send_keys("百度")
def test_xpath(self):
self.driver.find_element(By.XPATH,"//*[@name='wd']").send_keys("百度")
self.driver.find_element_by_xpath("//*[@id='su']").click()
def test_tag_name(self):
# 输入框是input标签,按钮也是,所以这里也会报错
self.driver.find_element(By.TAG_NAME,"input").send_keys("百度")
def test_link(self):
self.driver.find_element(By.LINK_TEXT,"新闻").click()
def test_plink(self):
self.driver.find_element_by_partial_link_text("闻").click()
def test_classname(self):
# 新闻链接,百度首页左上角的链接文字class name 都是相同的,所以此处会报错
self.driver.find_element(By.CLASS_NAME,"mnav c-font-normal c-color-t").click()
def test_cssselector(self):
self.driver.find_element(By.CSS_SELECTOR,"#kw").send_keys("百度")
self.driver.find_element_by_css_selector("#su").click()
总结
通过find_element的源码发现:ID/NAME/TAG_NAME/CLASS_NAME都会被替换成CSS_SELECTOR方式实现,因此基本上所有的定位都可以用xpath或css selector方式,只要学好如何使用xpath或css selector定位即可。
[created_at:2020-06-27 updated_at:2020-06-28]
[我的导航目录]