Selenium——进阶使用

浏览器的控制

1
2
3
4
5
6
driver.set_window_size()#设置宽高
driver.maximize_window()#全屏显示

driver.forward()  #浏览器的上一步
driver.back()  #浏览器的后退
driver.refresh()  #浏览器的刷新

浏览器的窗口切换

获取窗口句柄

1
2
handles=driver.window_handles 
print(handles)

切换窗口命令

1
driver.switch_to.window(handles[0])
handles[0] 切换到最开始打开的窗口
handles[-1] 切换到最新打开的窗口
handles[-2] 倒数第二个打开的窗口

进阶姿势

JS代码执行

executeScript是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕; executeAsyncScript方法是异步方法,它不会阻塞主线程执行。

1
2
3
#值可写多个JS变量
execute_script()
executeAsyncScript()

上传文件的元素操作

1
2
WebElement adFileUpload =driver.findElement(By.id("上传"));
String filePath = "C:\1.php";adFileUpload.sendKeys(filePath)

隐式等待

如果在30秒内执行就继续下一步,没有执行就等待30秒,30秒如果元素还未出现则跳过,不抛出异常

1
driver.implicitly_wait(30)

显式等待

如果执行就继续下一步,没有执行就等待30秒,30秒如果元素还未出现则抛出异常,不继续 demo: python result=WebDriverWait(driver,10).until(expected_conditions.alert_is_present())

1
2
3
4
5
6
7
alert_is_present()  #判断页面是否出现alert框
title_is()  #判断页面title内容是与传入的title_text内容完全匹配
title_contains()  #判断页面title标签的内容包含
partial_title()  #只需要部分匹配即可
text_to_be_present_in_element_value()  #判断text是否出现在元素的value属性值中
text_to_be_present_in_element() #判断文本内容test是否出现在某个元素中,判断的是元素的text
presence_of_all_elements_located(*locator*)#判断页面至少有一个如果元素出现,如果满足条件,返回所有满足定位表达式的页面元素
技巧
不等待某个元素加载,使用time.sleep方法,方便快捷。

键盘操作

第一种方法——Selenium自带的Keys包

1
from selenium.webdriver.common.keys import Keys

常见的键盘操作:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 删除键
sent_keys(Keys.BACK_SPACE)    
# 空格键
sent_keys(Keys.SPACE)
# tab 键
sent_keys(Keys.TAB)
# delete 键
sent_keys(Keys.DELETE)
# + 键
sent_keys(Keys.ADD)
# enter 键
sent_keys(Keys.ENTER)
# shift 键
sent_keys(Keys.SHIFT)
# ctrl+A:全选
sent_keys(Keys.CONTROL, 'a')
# ctrl+C:复制
sent_keys(Keys.CONTROL, 'c')
# ctrl+V:粘贴
sent_keys(Keys.CONTROL, 'v')
# ctrl+X:剪切
sent_keys(Keys.CONTROL, 'x')
# F1 键
sent_keys(Keys.F1)
# 数字9 键
sent_keys(Keys.NUMPAD9)

2289881-20220608220557218-225439528

第二种方法——Python的第三方库——pywin32库

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
import win32api
import win32con

class KeyboardKeys(object):
    #模拟键盘按键类
    VK_CODE={
        'enter':0x0D,
        'ctrl':0x11,
        'v':0x56
    }

    @staticmethod
    def keyDown(keyName):
        #按下按键
        win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,0,0)


    @staticmethod
    def keyUp(keyName):
        #释放按键
        win32api.keybd_event(KeyboardKeys.VK_CODE[keyName],0,win32con.KEYEVENTF_KEYUP,0)


    @staticmethod
    def oneKey(key):
        #模拟单个按键
        KeyboardKeys.keyDown(key)
        KeyboardKeys.keyUp(key)

    @staticmethod
    def twoKeys(key1,key2):
        #模拟两个组合键
        KeyboardKeys.keyDown(key1)
        KeyboardKeys.keyDown(key2)
        KeyboardKeys.keyUp(key2)
        KeyboardKeys.keyUp(key1)
问题

Keybd_event() 共有四个参数:

第一个为按键的虚拟键值,如回车键为vk_return,tab键为vk_tab;

第二个参数为扫描码,一般不用设置,用0代替就行;

第三个参数为选项标志,如果为keydown则置0即可,如果为keyup则设成"KEYEVENTF_KEYUP";

第四个参数一般也是置0即可。

鼠标操作

1
from selenium.webdriver.common.action_chains import ActionChains

全局鼠标操作语法如下:

1.初始化ActionChians类(动作链条):

 actions = ActionChains(driver) 

2.找到要操作的元素:

 element = find_element (值)

3.调用鼠标操作方法:

actions.move_to_element(element) 

4.执行鼠标操作方法:

actions.perform()

调用 perform() 方法时,队列中的操作会依次进行。

常用方法

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
double_click(on_element=None) #双击鼠标左键

#常用于拖拽验证码环节,不包括图像补全验证码。
source = driver.find_element_by_id(xxx)
target = driver.find_element_by_id(xxx)
drag_and_drop(source, target)
action.drag_and_drop(source, target).perform()  #拖拽元素

move_by_offset(xoffset, yoffset)  #鼠标从1位置移动到2坐标
release(on_element=None)  #在元素上释放按住的鼠标按钮(在某个元素位置松开鼠标左键)
注意
最终调用 perform() 方法时,队列中的操作才会依次进行。
0%