一、查找元素
前提:首先需要先引入
from selenium import webdriver
from selenium.webdriver.common.by import By
查找元素的方法
? find_element(By.ID,”loginName”)
? find_element(By.NAME,”SubjectName”)
? find_element(By.CLASS_NAME,”u-btn-levred”)
? find_element(By.TAG_NAME,”input”)
? find_element(By.LINK_TEXT,”退出”)
? find_element(By.PARTIAL_LINK_TEXT,”退”)
? find_element(By.XPATH,”.//*[@id=’Title”)
? find_element(By.CSS_SELECTOR,”[type=submit]”)
1.1、通过ID查找元素
如果找不到任何元素,会抛出 NoSuchElementException 异常
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
</form>
</body>
<html>
可以这样查找表单(form)元素:
login_form = driver.find_element(By.ID,”loginForm”)
1.2、通过Name查找元素
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
name属性为 username 的元素可以像下面这样查找:
username = driver.find_element(By.NAME,”username ”)
1.3、通过XPath查找元素
使用XPath的主要原因之一就是当你想获取一个既没有id属性也没有name属性的元素时, 可以通过XPath使用元素的绝对位置来获取(这是不推荐的),或相对于有一个id或name属性的元素 (理论上的父元素)的来获取你想要的元素。XPath定位器也可以通过非id和name属性查找元素。
绝对的XPath是所有元素都从根元素的位置(HTML)开始定位,只要应用中有轻微的调整,会就导致你的定位失败。 但是通过就近的包含id或者name属性的元素出发定位你的元素,这样相对关系就很靠谱, 因为这种位置关系很少改变,所以增强测试的健壮性。
举例:
<html>
<body>
<form id="loginForm">
<input name="username" type="text" />
<input name="password" type="password" />
<input name="continue" type="submit" value="Login" />
<input name="continue" type="button" value="Clear" />
</form>
</body>
<html>
可以这样查找表单(form)元素:
#绝对定位 (页面结构轻微调整就会被破坏)
login_form = driver.find_element(By.XPATH, "/html/body/form[1]")
#HTML页面中的第一个form元素
login_form = driver.find_element(By.XPATH, "//form[1]")
#包含 id 属性并且其值为 loginForm 的form元素
login_form = driver.find_element(By.XPATH, "//form[@id='loginForm']")
username元素可以如下获取:
#第一个form元素中包含name属性并且其值为 username 的input元素
username = driver.find_element(By.XPATH, "//form[input/@name='username']")
#id为 loginForm 的form元素的第一个input子元素
username = driver.find_element(By.XPATH,"//form[@id='loginForm']/input[1]")
#第一个name属性为 username 的input元素
username = driver.find_element(By.XPATH,"//input[@name='username']")
“Clear” 按钮可以如下获取:
clear_button = driver.find_element(By.XPATH,"//input[@name='continue'][@type='button']")
clear_button = driver.find_element(By.XPATH,"//form[@id='loginForm']/input[4]")
1.4、通过链接文本获取超链接
示例:
<html>
<body>
<p>Are you sure you want to do this?</p>
<a href="continue.html">Continue</a>
<a href="cancel.html">Cancel</a>
</body>
<html>
continue.html 超链接可以被这样查找到:
continue_link = driver.find_element(By.LINK_TEXT,”Continue”)
1.5、通过标签名查找元素
示例:
<html>
<body>
<h1>Welcome</h1>
<p>Site content goes here.</p>
</body>
<html>
h1 元素可以如下查找:
heading1 = driver.find_element(By.TAG_NAME,”h1”)
1.6、通过Class name 定位元素
示例:
<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>
p 元素可以如下查找:
content = driver.find_element(By.CLASS_NAME,”content”)
1.7、通过CSS选择器查找元素
示例:
<html>
<body>
<p class="content">Site content goes here.</p>
</body>
<html>
p 元素可以如下查找:
content = driver.find_element(By.CSS_SELECTOR,'p.content')
二、等待页面加载完成
显式等待WebDriverWait()、隐式等待implicitly_wait()、强制等待sleep()
2.1、显式等待
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver = webdriver.Firefox()
driver.get("http://somedomain/url_that_delays_loading")
try:
element = WebDriverWait(driver, 10).until(
EC.presence_of_element_located((By.ID, "myDynamicElement"))
)
finally:
driver.quit()
在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常。默认检测频率为0.5s,默认抛出异常为:NoSuchElementException
2.2、隐式等待
如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期。
from selenium import webdriver
driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element(By.ID,"myDynamicElement")
三、常用的操作
func | Value |
---|
get(url) | 打开网页 | send_keys(str) | 输入 | click() | 点击 | clear() | 清空 | text | 获取标签文本内容 | get_attribute(‘属性’) | 获取元素属性值 | close() | 关闭当前标签页 | quit() | 关闭浏览器,释放进程 |
四、窗口切换操作
handle1 = driver.current_window_handle #获取当前窗口句柄
handles = driver.window_handles #获取所有窗口句柄
driver.switch_to.window(handles[0]) #切换到第一个窗口的句柄
driver.switch_to.window(handles[-1]) #切换到最新窗口的句柄
五、鼠标操作
actionchain是一种自动化低级交互的方法,例如鼠标移动、鼠标按钮操作、键按和上下文菜单交互。这对于执行更复杂的操作,如悬停和拖放非常有用。
方法 | 描述 |
---|
def click(self, on_element=None) | 鼠标左键单击 | def click_and_hold(self, on_element=None) | 鼠标左键按键,不释放 | def context_click(self, on_element=None) | 鼠标右击 | def double_click(self, on_element=None) | 鼠标左键双击 | def drag_and_drop(self, source, target) | 鼠标拖曳动作,将指定元素位置拖曳到目标元素位置,来移动元素 | def drag_and_drop_by_offset(self, source, xoffset, yoffset) | 鼠标拖曳动作,将指定元素按沿x、y方向拖曳指定距离来移动元素 | def move_by_offset(self, xoffset, yoffset) | 将鼠标光标沿x、y方向移动指定距离,来实现鼠标的移动 | def move_to_element(self, to_element) | 将鼠标光标移动到指定的元素上 | def move_to_element_with_offset(self, to_element, xoffset, yoffset) | 将鼠标光标移动到指定的元素相对元素左上角位置偏移(xoffset、yoffset)的位置 | def release(self, on_element=None) | 释放鼠标,与click_and_hold函数配对使用 | def key_down(self, value, element=None) | 按下指定的键盘按键 | def key_up(self, value, element=None) | 释放已按下的键盘按键(与key_down配套使用) | def send_keys(self, *keys_to_send) | 键盘输入 | def send_keys_to_element(self, element, *keys_to_send) | 给指定元素(可输入元素)进行键盘输入 | def perform(self) | 执行所有存储的动作 | def reset_actions(self) | 清空所有存储的动作 | def pause(self, seconds) | 在指定的时间内暂定所有的输入 |
六、特殊字符键入
Set of special keys codes.
NULL = u'\ue000'
CANCEL = u'\ue001' # ^break
HELP = u'\ue002'
BACKSPACE = u'\ue003'
BACK_SPACE = BACKSPACE
TAB = u'\ue004'
CLEAR = u'\ue005'
RETURN = u'\ue006'
ENTER = u'\ue007'
SHIFT = u'\ue008'
LEFT_SHIFT = SHIFT
CONTROL = u'\ue009'
LEFT_CONTROL = CONTROL
ALT = u'\ue00a'
LEFT_ALT = ALT
PAUSE = u'\ue00b'
ESCAPE = u'\ue00c'
SPACE = u'\ue00d'
PAGE_UP = u'\ue00e'
PAGE_DOWN = u'\ue00f'
END = u'\ue010'
HOME = u'\ue011'
LEFT = u'\ue012'
ARROW_LEFT = LEFT
UP = u'\ue013'
ARROW_UP = UP
RIGHT = u'\ue014'
ARROW_RIGHT = RIGHT
DOWN = u'\ue015'
ARROW_DOWN = DOWN
INSERT = u'\ue016'
DELETE = u'\ue017'
SEMICOLON = u'\ue018'
EQUALS = u'\ue019'
NUMPAD0 = u'\ue01a' # number pad keys
NUMPAD1 = u'\ue01b'
NUMPAD2 = u'\ue01c'
NUMPAD3 = u'\ue01d'
NUMPAD4 = u'\ue01e'
NUMPAD5 = u'\ue01f'
NUMPAD6 = u'\ue020'
NUMPAD7 = u'\ue021'
NUMPAD8 = u'\ue022'
NUMPAD9 = u'\ue023'
MULTIPLY = u'\ue024'
ADD = u'\ue025'
SEPARATOR = u'\ue026'
SUBTRACT = u'\ue027'
DECIMAL = u'\ue028'
DIVIDE = u'\ue029'
F1 = u'\ue031' # function keys
F2 = u'\ue032'
F3 = u'\ue033'
F4 = u'\ue034'
F5 = u'\ue035'
F6 = u'\ue036'
F7 = u'\ue037'
F8 = u'\ue038'
F9 = u'\ue039'
F10 = u'\ue03a'
F11 = u'\ue03b'
F12 = u'\ue03c'
META = u'\ue03d'
COMMAND = u'\ue03d'
用法举例:
search = driver.find_element(By.ID, "toolbar-search-input")
search.send_keys("python selenium")
search.send_keys(Keys.ENTER) #键盘操作,回车
search.send_keys(Keys.CONTROL,'c') #复制(Ctrl+C)
七、find_element_by和find_element区别
selenium的find_element_by_*目前大部分是使用find_element(**)
八、查看API的详细封装
找到python的安装位置,这里以windows为例 开始–》python3.7–>在IDE上右击–》打开文件位置 然后进入\Lib\site-packages\selenium\
我这里是安装的C盘 C:\Users\Administrator\AppData\Local\Programs\Python\Python37\Lib\site-packages\selenium
九、示例(在csdn中搜索python selenium)
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.keys import Keys
import time
driver = webdriver.Chrome()
driver.implicitly_wait(15)
start_time = time.time()
driver.get("https://blog.csdn.net/")
handle1 = driver.current_window_handle #获取当前窗口句柄
#driver.maximize_window() #最大化窗口
search = driver.find_element(By.ID, "toolbar-search-input")
search.send_keys("python selenium")
search.send_keys(Keys.ENTER)
#第二种方式
#search = driver.find_element(By.ID, "toolbar-search-button").click()
handle2 = driver.current_window_handle #获取当前窗口句柄
handles = driver.window_handles #获取所有窗口句柄
driver.switch_to.window(handles[0]) #切换到第一个窗口的句柄
time.sleep(2)
driver.switch_to.window(handles[-1]) #切换到最新窗口的句柄
time.sleep(2)
#点击最新按钮排序
search = driver.find_element(By.CLASS_NAME, "new").click()
end_time = time.time()
print("time cost: ",end_time-start_time)
time.sleep(20)
driver.quit()
|