selenium介绍
- selenium支持web浏览器的自动化,主要由3个工具构成:WebDriver、IDE、Grid
- 官网:https://www.selenium.dev/
下载地址
- chromedriver下载地址:http://npm.taobao.org/mirrors/chromedriver
配置环境变量
- vim ~/.bash_profile
- 检查是否配置好:直接在控制台输入chromedriver
文档
- 学习文档:https://selenium-python.readthedocs.io/
隐式等待
- 隐式等待:设置一个等待时间,轮询查找(默认0.5秒)元素是否出现,如果没有就抛出异常
- 全局设置
- 写法 self.driver.implicitly_wait(5)
显式等待
- 在代码中定义等待条件,当条件发生时才继续执行代码
- WebDriverWait配合until()和until_not()方法,根据判断条件进行等待
- 程序每隔一段时间(默认为0.5秒)进行条件判断,如果条件成立,则执行下一步,否则继续等待,直到超过设置的最长时间
import time
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions
from selenium.webdriver.support.wait import WebDriverWait
class TestWait:
def setup(self):
self.driver = webdriver.Chrome()
self.driver.get("https://home.testing-studio.com/")
self.driver.implicitly_wait(3)
def teardown(self):
self.driver.quit()
def test_wait(self):
time.sleep(3)
self.driver.find_element(By.XPATH, '//*[@title="归入各种类别的所有主题"]').click()
'''
def wait(x):
return len(self.driver.find_elements(By.XPATH, '//*[@class="table-heading"]')) >= 1
WebDriverWait(self.driver, 10).until(wait)
'''
WebDriverWait(self.driver, 10).until(
expected_conditions.element_to_be_clickable((By.XPATH, '//*[@class="table-heading"]')))
self.driver.find_element(By.XPATH, '//*[@title="在最近的一年,一月,一周或一天最活跃的主题"]').click()
web控件定位与常见操作
点击与输入
- self.driver.find_element(By.ID, ‘kw’).click()
- self.driver.find_element(By.ID, ‘su’).send_keys(“hello world”)
元素定位-id
- driver.find_element_by_id(“kw”)
元素定位-name
- driver.find_element_by_name(“kw”)
元素定位-文本内容
元素定位-xpath
表达式 | 描述 |
---|
nodename | 选取此节点的所有子节点 |
/ | 从根节点选取 |
// | 从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置 |
. | 选取当前节点 |
. . | 选取当前节点的父节点 |
@ | 选取属性 |
* | 任意元素 |
表达式 | 结果 |
---|
/bookstore/book[1] | 选取属于bookstore子元素的第一个book元素 |
/bookstore/book[last()] | 选取属于bookstore子元素的最后一个book元素 |
/bookstore/book[last()-1] | 选取属于bookstore子元素的倒数第二个book元素 |
bookstore/book[position() < 3] | 选取最前面的两个属于bookstore元素的子元素的book元素 |
//title[@lang=‘eng’] | 选取所有title元素,且这些元素拥有值为eng的lang属性 |
bookstore/book[price>35] | 选取bookstore元素的所有book元素,且其中的price元素的值必须大于35 |
bookstore/book[price>35]/title | 选取bookstore元素中的book元素的所有title元素,且其中的price元素的值必须大于35 |
- 举例:driver.find_element_by_xpath(‘//*[@id=“kw”]’).send_keys(‘猿辅导’)
- 使用chrome的Console进行验证,写法:$x(‘xpath表达式’) ;举例: $x(‘//*[@class=“s_ipt”]’)
元素定位-css_selector
- css_selector采用样式定位,速度要优于xpath
选择器 | 例子 | 描述 |
---|
.class | .intro | class="intro"的所有元素 |
#id | #firstname | id="firstname"的所有元素 |
* | * | 选择所有的元素 |
element | p | 选择所有元素 |
element,element | div,p | 选择所有 < div > 元素和所有 < p > 元素 |
element element | div p | 选择 < div > 元素内部的所有 < p > 元素(子孙元素) |
element > element | div>p | 选择父元素为 < div > 元素的所有 < p > 元素(子元素) |
element+element | div+p | 选择紧跟在 < div > 元素之后的所有 < p > 元素 |
attribute | [target] | 选择带有target属性的所有元素 |
[attribute=value] | a[target=_blank]] | 具有属性target="_blank"的所有a元素 |
:nth-child(n) | p:nth-child(2) | 属于其父元素的第二个p元素(注:是父元素下的第二个元素,不是父元素下的第二个p元素) |
:nth-last-child(n) | p:nth-last-child(1) | 属于其父元素的倒数第一个p元素 |
element1~element2 | p~ul | 选择前面有 < p > 元素的每个< ul >元素 |
- 使用chrome的Console进行验证,写法:$(‘css selector表达式’),写法举例:
- $(‘[name=“wd”]’) 查找属性包括 name=“wd” 的元素
- $(‘.s_ipt>input’) 查找属性包括 class=“s_ipt” 的input元素