1 测试样本
<!DOCTYPE html>
<html>
<head>
<meta charset="utf-8">
<title>Selenium Test</title>
<style type="text/css">
* {margin: 10px}
form {border:1px red solid}
span {color: green}
</style>
<script src="https://code.jquery.com/jquery-3.3.1.slim.min.js"></script>
</head>
<body>
<h1 id="my_h1">This is h1 element</h1>
<p class="my_p" index="first"><a href="https://www.baidu.com" name="baidu_link">Go to <span color="green">baidu</span></a></p>
<p class="my_p" index="second">The second p</p>
<p class="my_p" index="third"><input type="file" name="pic" accept="image/gif, image/jpeg"/></p>
<iframe name="ifm" src="https://www.baidu.com" width="1000px" height="500px"></iframe>
<div class="my_list">
<ul>
<li>python</li>
<li>java</li>
<li>c++</li>
</ul>
</div>
<form action="#" name="my_form">
<div><input type="text" name="username" value="input username"/></div>
<div>
<input type="radio" name="sex" value="male" checked />male
<input type="radio" name="sex" value="female" /> female
</div>
<div>
<select name="addr">
<option value="wuhan" checked>wuhan</option>
<option value="shanghai">shanghai</option>
<option value="beijing">beijing</option>
<option value="shenzhen">shenzhen</option>
</select>
</div>
<div>
<input type="checkbox" name="hobby" value="reading" />reading
<input type="checkbox" name="hobby" value="game" />game
<input type="checkbox" name="hobby" value="music" />music
</div>
<div><input type="submit" value="submit"/></div>
</form>
</body>
</html>
2 定位方式
通过原码可知selenium支持8种元素定位方式
当然通过调用JS,还可以支持dom和jquery方式定位
# from selenium.webdriver.common.by import By
class By(object):
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"
测试准备:
-
将样本文件保存为
selenium.html
-
去 http://npm.taobao.org/mirrors/chromedriver/ 下载对应版本的chrome驱动
-
打开 jupyter 或者其他IDE工具,执行初始化操作
from selenium.webdriver import Chrome from selenium.webdriver.common.by import By from selenium.webdriver.support.select import Select driver = Chrome(executable_path=r"C:\Users\Administrator\Desktop\chromedriver.exe") driver.get("file:///C:/Users/Administrator/Desktop/selenium.html")
2.1 ID定位
driver.find_element(By.ID, "my_h1").text # This is h1 element
driver.find_element_by_id("my_h1").text
2.2 NAME定位
driver.find_element(By.NAME, "baidu_link").text # Go to baidu
driver.find_element_by_name("baidu_link").text
2.3 LINK_TEXT定位
driver.find_element(By.LINK_TEXT, "Go to baidu")
driver.find_element_by_link_text("Go to baidu")
driver.find_element(By.PARTIAL_LINK_TEXT, "to baidu")
driver.find_element_by_partial_link_text("baidu")
2.4 TAG_NAME定位
driver.find_element(By.TAG_NAME, "a").text # Go to baidu
driver.find_element_by_tag_name("a").text
2.5 CLASS_NAME定位
driver.find_element(By.CLASS_NAME, "my_p").text # Go to baidu,如何选择第二个my_p元素?
driver.find_element_by_class_name("my_p").text
2.6 XPATH定位
# 绝对路径
driver.find_element(By.XPATH, "/html/body/p[1]").text # Go to baidu,索引从1开始
# 相对路径
driver.find_element(By.XPATH, "//p[2]").text # The second p
# 指定属性(@attribute='value')
driver.find_element(By.XPATH, "//span[@color='green']").text # baidu
# last()
driver.find_element(By.XPATH, "//p[last()]").text # The second p
# 组合条件
driver.find_element(By.XPATH, "//p[@class='my_p' and @index='second']").text # The second p
2.7 CSS定位
# ID
driver.find_element(By.CSS_SELECTOR, "#my_h1").text # This is h1 element
# class
driver.find_element(By.CSS_SELECTOR, ".my_list >ul >li:nth-child(2)").text # java
# 指定属性
driver.find_element(By.CSS_SELECTOR, "input[name='hobby']:last-child").get_attribute("value") # music
# 伪类
# :link :hover :active :enabled :disabled :checked :default :valid :invalid :required
driver.find_elements(By.CSS_SELECTOR, "input[name='hobby']:checked")
# 否定
driver.find_elements(By.CSS_SELECTOR, "input[name='hobby']:not(:checked)")
# 组合条件
driver.find_element(By.CSS_SELECTOR, "p[class='my_p'][index='second']").text # The second p
# 文件上传
driver.find_element(By.CSS_SELECTOR, "input[name='pic']").send_keys(r'C:\Users\Administrator\Desktop\img.jpg')
# 跳转frame
# 注意切换了frame,一定要切换回来switch_to.default_content()
iframe = driver.find_element(By.CSS_SELECTOR, "iframe[name='ifm']")
driver.switch_to.frame(iframe)
driver.find_element(By.ID, "kw").send_keys('switch to frame')
2.8 DOM定位
# getElementById(单数) getElementsByName(复数)getElementsByTagName getElementsByClassName
# return 关键字不能丢
driver.execute_script("return document.getElementById('my_h1')").text # This is h1 element
# 索引从0开始,与上面的xpath,css不同
driver.execute_script("return document.getElementsByName('sex')[1]").get_attribute("value") # female
# 获取文本内容
driver.execute_script("return document.getElementsByTagName('p')[0].innerText") # Go to baidu
# 获取标签属性
driver.execute_script("return document.getElementsByName('ifm')[0].src") # https://www.baidu.com/
# 滚动到页面底端
driver.execute_script("window.scrollTo(0,document.body.scrollHeight)")
2.9 JQUERY定位
# 使用jquery的前提,要求页面加载jquery的js文件
# 同样要求return 关键字
# 返回的结果统一为数组,即使使用了类似first的操作
# jquery操作可以参考 http://jquery.cuishifeng.cn/
driver.execute_script("return $('ul li:eq(0)')")[0].text # python
# 表单选择器
# :input :password :radio :checkbox :button :file
driver.execute_script("return $(':checkbox:first')")[0].get_attribute("value") # reading
3 find_element V.S. find_elements
-
find_elements
返回列表,如果未发现对象,返回空列表 -
find_element
,即使有多个对象,也只返回第一个;如果未发现对象,则抛出异常
4 select操作
# 使用Selenium内置的Select对象
sel = Select(driver.find_element(By.CSS_SELECTOR, "select[name='addr']"))
sel.select_by_index(1) # 注意,索引从0开始
sel.select_by_value("beijing")
sel.select_by_visible_text("shenzhen")
5 Radio && Checkbox
# 使用click方法选择
driver.find_element(By.CSS_SELECTOR, "input[name='sex'][value='female']").click()
# 模拟space按键
driver.find_element(By.CSS_SELECTOR, "input[name='sex'][value='male']").send_keys(Keys.SPACE)
# checkbox同理,但有个问题需注意,选择某项的时候,可能是勾选,也有可能是取消,所以需要判断
driver.find_element(By.CSS_SELECTOR, "input[name='hobby']:nth-child(2)").is_selected()
# 勾选未选择的check
checks = driver.find_elements(By.CSS_SELECTOR, "input[name='hobby']:not(:checked)")
for ck in checks:
ck.click()
网友评论