想入坑自动化测试?先了解下必备工具---Selenium_selenium发送post请求

先自我介绍一下,小编浙江大学毕业,去过华为、字节跳动等大厂,目前阿里P7

深知大多数程序员,想要提升技能,往往是自己摸索成长,但自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前!

因此收集整理了一份《2024年最新软件测试全套学习资料》,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友。
img
img
img
img
img

既有适合小白学习的零基础资料,也有适合3年以上经验的小伙伴深入学习提升的进阶课程,涵盖了95%以上软件测试知识点,真正体系化!

由于文件比较多,这里只是将部分目录截图出来,全套包含大厂面经、学习笔记、源码讲义、实战项目、大纲路线、讲解视频,并且后续会持续更新

如果你需要这些资料,可以添加V获取:vip1024b (备注软件测试)
img

正文

六、如何打开浏览器

我们继续看源码 C:\Python36\Lib\site-packages\selenium\webdriver\chrome\webdriver.py 的51-57行代码,调用了父类RemoteWebDriver 的初始化方法,我们看这个方法做了什么事?

C:\Python36\Lib\site-packages\selenium\webdriver\remote\webdriver.py

1 class WebDriver(object):
2 “”"
3 Controls a browser by sending commands to a remote server.
4 This server is expected to be running the WebDriver wire protocol
5 as defined at
6 https://github.com/SeleniumHQ/selenium/wiki/JsonWireProtocol
7
8 :Attributes:
9 - session_id - String ID of the browser session started and controlled by this WebDriver.
10 - capabilities - Dictionaty of effective capabilities of this browser session as returned
11 by the remote server. See https://github.com/SeleniumHQ/selenium/wiki/DesiredCapabilities
12 - command_executor - remote_connection.RemoteConnection object used to execute commands.
13 - error_handler - errorhandler.ErrorHandler object used to handle errors.
14 “”"
15
16 _web_element_cls = WebElement
17
18 def init(self, command_executor=‘http://127.0.0.1:4444/wd/hub’,
19 desired_capabilities=None, browser_profile=None, proxy=None,
20 keep_alive=False, file_detector=None, options=None):
21 “”"
22 Create a new driver that will issue commands using the wire protocol.
23
24 :Args:
25 - command_executor - Either a string representing URL of the remote server or a custom
26 remote_connection.RemoteConnection object. Defaults to ‘http://127.0.0.1:4444/wd/hub’.
27 - desired_capabilities - A dictionary of capabilities to request when
28 starting the browser session. Required parameter.
29 - browser_profile - A selenium.webdriver.firefox.firefox_profile.FirefoxProfile object.
30 Only used if Firefox is requested. Optional.
31 - proxy - A selenium.webdriver.common.proxy.Proxy object. The browser session will
32 be started with given proxy settings, if possible. Optional.
33 - keep_alive - Whether to configure remote_connection.RemoteConnection to use
34 HTTP keep-alive. Defaults to False.
35 - file_detector - Pass custom file detector object during instantiation. If None,
36 then default LocalFileDetector() will be used.
37 - options - instance of a driver options.Options class
38 “”"
39 capabilities = {}
40 if options is not None:
41 capabilities = options.to_capabilities()
42 if desired_capabilities is not None:
43 if not isinstance(desired_capabilities, dict):
44 raise WebDriverException(“Desired Capabilities must be a dictionary”)
45 else:
46 capabilities.update(desired_capabilities)
47 if proxy is not None:
48 warnings.warn(“Please use FirefoxOptions to set proxy”,
49 DeprecationWarning, stacklevel=2)
50 proxy.add_to_capabilities(capabilities)
51 self.command_executor = command_executor
52 if type(self.command_executor) is bytes or isinstance(self.command_executor, str):
53 self.command_executor = RemoteConnection(command_executor, keep_alive=keep_alive)
54 self._is_remote = True
55 self.session_id = None
56 self.capabilities = {}
57 self.error_handler = ErrorHandler()
58 self.start_client()
59 if browser_profile is not None:
60 warnings.warn(“Please use FirefoxOptions to set browser profile”,
61 DeprecationWarning, stacklevel=2)
62 self.start_session(capabilities, browser_profile)
63 self._switch_to = SwitchTo(self)
64 self._mobile = Mobile(self)
65 self.file_detector = file_detector or LocalFileDetector()

这里有一行最重要的代码,62行self.start_session(capabilities, browser_profile) 这个方法,继续看一下这个方法的源码做了什么工作

1 def start_session(self, capabilities, browser_profile=None):
2 “”"
3 Creates a new session with the desired capabilities.
4
5 :Args:
6 - browser_name - The name of the browser to request.
7 - version - Which browser version to request.
8 - platform - Which platform to request the browser on.
9 - javascript_enabled - Whether the new session should support JavaScript.
10 - browser_profile - A selenium.webdriver.firefox.firefox_profile.FirefoxProfile object. Only used if Firefox is requested.
11 “”"
12 if not isinstance(capabilities, dict):
13 raise InvalidArgumentException(“Capabilities must be a dictionary”)
14 if browser_profile:
15 if “moz:firefoxOptions” in capabilities:
16 capabilities[“moz:firefoxOptions”][“profile”] = browser_profile.encoded
17 else:
18 capabilities.update({‘firefox_profile’: browser_profile.encoded})
19 w3c_caps = _make_w3c_caps(capabilities)
20 parameters = {“capabilities”: w3c_caps,
21 “desiredCapabilities”: capabilities}
22 response = self.execute(Command.NEW_SESSION, parameters)
23 if ‘sessionId’ not in response:
24 response = response[‘value’]
25 self.session_id = response[‘sessionId’]
26 self.capabilities = response.get(‘value’)
27
28 # if capabilities is none we are probably speaking to
29 # a W3C endpoint
30 if self.capabilities is None:
31 self.capabilities = response.get(‘capabilities’)
32
33 # Double check to see if we have a W3C Compliant browser
34 self.w3c = response.get(‘status’) is None
35 self.command_executor.w3c = self.w3c

分析这部分源码可以发现22行是向地址localhost:9515/session发送了一个post请求,参数是json格式的,然后返回特定的响应信息给程序(这里主要就是新建了一个sessionid),最终打开了浏览器

ok,打开浏览器的操作完成了

七、如何执行对应操作

查看C:\Python36\Lib\site-packages\selenium\webdriver\chrome\webdriver.py源码(第一个源码中的51-57行)

51 try:
52 RemoteWebDriver.init(
53 self,
54 command_executor=ChromeRemoteConnection(
55 remote_server_addr=self.service.service_url,
56 keep_alive=keep_alive),
57 desired_capabilities=desired_capabilities)

点击ChromeRemoteConnection查看一下源码

1 from selenium.webdriver.remote.remote_connection import RemoteConnection
2
3
4 class ChromeRemoteConnection(RemoteConnection):
5
6 def init(self, remote_server_addr, keep_alive=True):
7 RemoteConnection.init(self, remote_server_addr, keep_alive)
8 self._commands[“launchApp”] = (‘POST’, ‘/session/ s e s s i o n I d / c h r o m i u m / l a u n c h a p p ′ ) 9 s e l f . c o m m a n d s [ " s e t N e t w o r k C o n d i t i o n s " ] = ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/chromium/launch_app') 9 self._commands["setNetworkConditions"] = ('POST', '/session/ sessionId/chromium/launchapp)9self.commands["setNetworkConditions"]=(POST,/session/sessionId/chromium/network_conditions’)
10 self._commands[“getNetworkConditions”] = (‘GET’, ‘/session/ s e s s i o n I d / c h r o m i u m / n e t w o r k c o n d i t i o n s ′ ) 11 s e l f . c o m m a n d s [ ′ e x e c u t e C d p C o m m a n d ′ ] = ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/chromium/network_conditions') 11 self._commands['executeCdpCommand'] = ('POST', '/session/ sessionId/chromium/networkconditions)11self.commands[executeCdpCommand]=(POST,/session/sessionId/goog/cdp/execute’)

第7行访问的是localhost:9515/session地址,第8-11行,定义了一些和我们使用的浏览器(chrome)特有的接口地址,我们再看一下父类RemoteConnection里面源码

C:\Python36\Lib\site-packages\selenium\webdriver\remote\remote_connection.py:RemoteConnection

1 self._commands = {
2 Command.STATUS: (‘GET’, ‘/status’),
3 Command.NEW_SESSION: (‘POST’, ‘/session’),
4 Command.GET_ALL_SESSIONS: (‘GET’, ‘/sessions’),
5 Command.QUIT: (‘DELETE’, ‘/session/ s e s s i o n I d ′ ) , 6 C o m m a n d . G E T C U R R E N T W I N D O W H A N D L E : 7 ( ′ G E T ′ , ′ / s e s s i o n / sessionId'), 6 Command.GET_CURRENT_WINDOW_HANDLE: 7 ('GET', '/session/ sessionId),6Command.GETCURRENTWINDOWHANDLE:7(GET,/session/sessionId/window_handle’),
8 Command.W3C_GET_CURRENT_WINDOW_HANDLE:
9 (‘GET’, ‘/session/ s e s s i o n I d / w i n d o w ′ ) , 10 C o m m a n d . G E T W I N D O W H A N D L E S : 11 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/window'), 10 Command.GET_WINDOW_HANDLES: 11 ('GET', '/session/ sessionId/window),10Command.GETWINDOWHANDLES:11(GET,/session/sessionId/window_handles’),
12 Command.W3C_GET_WINDOW_HANDLES:
13 (‘GET’, ‘/session/ s e s s i o n I d / w i n d o w / h a n d l e s ′ ) , 14 C o m m a n d . G E T : ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/window/handles'), 14 Command.GET: ('POST', '/session/ sessionId/window/handles),14Command.GET:(POST,/session/sessionId/url’),
15 Command.GO_FORWARD: (‘POST’, ‘/session/ s e s s i o n I d / f o r w a r d ′ ) , 16 C o m m a n d . G O B A C K : ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/forward'), 16 Command.GO_BACK: ('POST', '/session/ sessionId/forward),16Command.GOBACK:(POST,/session/sessionId/back’),
17 Command.REFRESH: (‘POST’, ‘/session/ s e s s i o n I d / r e f r e s h ′ ) , 18 C o m m a n d . E X E C U T E S C R I P T : ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/refresh'), 18 Command.EXECUTE_SCRIPT: ('POST', '/session/ sessionId/refresh),18Command.EXECUTESCRIPT:(POST,/session/sessionId/execute’),
19 Command.W3C_EXECUTE_SCRIPT:
20 (‘POST’, ‘/session/ s e s s i o n I d / e x e c u t e / s y n c ′ ) , 21 C o m m a n d . W 3 C E X E C U T E S C R I P T A S Y N C : 22 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/execute/sync'), 21 Command.W3C_EXECUTE_SCRIPT_ASYNC: 22 ('POST', '/session/ sessionId/execute/sync),21Command.W3CEXECUTESCRIPTASYNC:22(POST,/session/sessionId/execute/async’),
23 Command.GET_CURRENT_URL: (‘GET’, ‘/session/ s e s s i o n I d / u r l ′ ) , 24 C o m m a n d . G E T T I T L E : ( ′ G E T ′ , ′ / s e s s i o n / sessionId/url'), 24 Command.GET_TITLE: ('GET', '/session/ sessionId/url),24Command.GETTITLE:(GET,/session/sessionId/title’),
25 Command.GET_PAGE_SOURCE: (‘GET’, ‘/session/ s e s s i o n I d / s o u r c e ′ ) , 26 C o m m a n d . S C R E E N S H O T : ( ′ G E T ′ , ′ / s e s s i o n / sessionId/source'), 26 Command.SCREENSHOT: ('GET', '/session/ sessionId/source),26Command.SCREENSHOT:(GET,/session/sessionId/screenshot’),
27 Command.ELEMENT_SCREENSHOT: (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/screenshot’),
28 Command.FIND_ELEMENT: (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t ′ ) , 29 C o m m a n d . F I N D E L E M E N T S : ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/element'), 29 Command.FIND_ELEMENTS: ('POST', '/session/ sessionId/element),29Command.FINDELEMENTS:(POST,/session/sessionId/elements’),
30 Command.W3C_GET_ACTIVE_ELEMENT: (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / a c t i v e ′ ) , 31 C o m m a n d . G E T A C T I V E E L E M E N T : 32 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/element/active'), 31 Command.GET_ACTIVE_ELEMENT: 32 ('POST', '/session/ sessionId/element/active),31Command.GETACTIVEELEMENT:32(POST,/session/sessionId/element/active’),
33 Command.FIND_CHILD_ELEMENT:
34 (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/element’),
35 Command.FIND_CHILD_ELEMENTS:
36 (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/elements’),
37 Command.CLICK_ELEMENT: (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/click’),
38 Command.CLEAR_ELEMENT: (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/clear’),
39 Command.SUBMIT_ELEMENT: (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/submit’),
40 Command.GET_ELEMENT_TEXT: (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/text’),
41 Command.SEND_KEYS_TO_ELEMENT:
42 (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/value’),
43 Command.SEND_KEYS_TO_ACTIVE_ELEMENT:
44 (‘POST’, '/session/ s e s s i o n I d / k e y s ′ ) , 45 C o m m a n d . U P L O A D F I L E : ( ′ P O S T ′ , " / s e s s i o n / sessionId/keys'), 45 Command.UPLOAD_FILE: ('POST', "/session/ sessionId/keys),45Command.UPLOADFILE:(POST,"/session/sessionId/file"),
46 Command.GET_ELEMENT_VALUE:
47 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/value’),
48 Command.GET_ELEMENT_TAG_NAME:
49 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/name’),
50 Command.IS_ELEMENT_SELECTED:
51 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/selected’),
52 Command.SET_ELEMENT_SELECTED:
53 (‘POST’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/selected’),
54 Command.IS_ELEMENT_ENABLED:
55 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/enabled’),
56 Command.IS_ELEMENT_DISPLAYED:
57 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/displayed’),
58 Command.GET_ELEMENT_LOCATION:
59 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/location’),
60 Command.GET_ELEMENT_LOCATION_ONCE_SCROLLED_INTO_VIEW:
61 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/location_in_view’),
62 Command.GET_ELEMENT_SIZE:
63 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/size’),
64 Command.GET_ELEMENT_RECT:
65 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/rect’),
66 Command.GET_ELEMENT_ATTRIBUTE:
67 (‘GET’, ‘/session/ s e s s i o n I d / e l e m e n t / sessionId/element/ sessionId/element/id/attribute/ n a m e ′ ) , 68 C o m m a n d . G E T E L E M E N T P R O P E R T Y : 69 ( ′ G E T ′ , ′ / s e s s i o n / name'), 68 Command.GET_ELEMENT_PROPERTY: 69 ('GET', '/session/ name),68Command.GETELEMENTPROPERTY:69(GET,/session/sessionId/element/ i d / p r o p e r t y / id/property/ id/property/name’),
70 Command.GET_ALL_COOKIES: (‘GET’, ‘/session/ s e s s i o n I d / c o o k i e ′ ) , 71 C o m m a n d . A D D C O O K I E : ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/cookie'), 71 Command.ADD_COOKIE: ('POST', '/session/ sessionId/cookie),71Command.ADDCOOKIE:(POST,/session/sessionId/cookie’),
72 Command.GET_COOKIE: (‘GET’, ‘/session/ s e s s i o n I d / c o o k i e / sessionId/cookie/ sessionId/cookie/name’),
73 Command.DELETE_ALL_COOKIES:
74 (‘DELETE’, ‘/session/ s e s s i o n I d / c o o k i e ′ ) , 75 C o m m a n d . D E L E T E C O O K I E : 76 ( ′ D E L E T E ′ , ′ / s e s s i o n / sessionId/cookie'), 75 Command.DELETE_COOKIE: 76 ('DELETE', '/session/ sessionId/cookie),75Command.DELETECOOKIE:76(DELETE,/session/sessionId/cookie/ n a m e ′ ) , 77 C o m m a n d . S W I T C H T O F R A M E : ( ′ P O S T ′ , ′ / s e s s i o n / name'), 77 Command.SWITCH_TO_FRAME: ('POST', '/session/ name),77Command.SWITCHTOFRAME:(POST,/session/sessionId/frame’),
78 Command.SWITCH_TO_PARENT_FRAME: (‘POST’, ‘/session/ s e s s i o n I d / f r a m e / p a r e n t ′ ) , 79 C o m m a n d . S W I T C H T O W I N D O W : ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/frame/parent'), 79 Command.SWITCH_TO_WINDOW: ('POST', '/session/ sessionId/frame/parent),79Command.SWITCHTOWINDOW:(POST,/session/sessionId/window’),
80 Command.CLOSE: (‘DELETE’, ‘/session/ s e s s i o n I d / w i n d o w ′ ) , 81 C o m m a n d . G E T E L E M E N T V A L U E O F C S S P R O P E R T Y : 82 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/window'), 81 Command.GET_ELEMENT_VALUE_OF_CSS_PROPERTY: 82 ('GET', '/session/ sessionId/window),81Command.GETELEMENTVALUEOFCSSPROPERTY:82(GET,/session/sessionId/element/ i d / c s s / id/css/ id/css/propertyName’),
83 Command.IMPLICIT_WAIT:
84 (‘POST’, ‘/session/ s e s s i o n I d / t i m e o u t s / i m p l i c i t w a i t ′ ) , 85 C o m m a n d . E X E C U T E A S Y N C S C R I P T : ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/timeouts/implicit_wait'), 85 Command.EXECUTE_ASYNC_SCRIPT: ('POST', '/session/ sessionId/timeouts/implicitwait),85Command.EXECUTEASYNCSCRIPT:(POST,/session/sessionId/execute_async’),
86 Command.SET_SCRIPT_TIMEOUT:
87 (‘POST’, ‘/session/ s e s s i o n I d / t i m e o u t s / a s y n c s c r i p t ′ ) , 88 C o m m a n d . S E T T I M E O U T S : 89 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/timeouts/async_script'), 88 Command.SET_TIMEOUTS: 89 ('POST', '/session/ sessionId/timeouts/asyncscript),88Command.SETTIMEOUTS:89(POST,/session/sessionId/timeouts’),
90 Command.DISMISS_ALERT:
91 (‘POST’, ‘/session/ s e s s i o n I d / d i s m i s s a l e r t ′ ) , 92 C o m m a n d . W 3 C D I S M I S S A L E R T : 93 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/dismiss_alert'), 92 Command.W3C_DISMISS_ALERT: 93 ('POST', '/session/ sessionId/dismissalert),92Command.W3CDISMISSALERT:93(POST,/session/sessionId/alert/dismiss’),
94 Command.ACCEPT_ALERT:
95 (‘POST’, ‘/session/ s e s s i o n I d / a c c e p t a l e r t ′ ) , 96 C o m m a n d . W 3 C A C C E P T A L E R T : 97 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/accept_alert'), 96 Command.W3C_ACCEPT_ALERT: 97 ('POST', '/session/ sessionId/acceptalert),96Command.W3CACCEPTALERT:97(POST,/session/sessionId/alert/accept’),
98 Command.SET_ALERT_VALUE:
99 (‘POST’, ‘/session/ s e s s i o n I d / a l e r t t e x t ′ ) , 100 C o m m a n d . W 3 C S E T A L E R T V A L U E : 101 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/alert_text'), 100 Command.W3C_SET_ALERT_VALUE: 101 ('POST', '/session/ sessionId/alerttext),100Command.W3CSETALERTVALUE:101(POST,/session/sessionId/alert/text’),
102 Command.GET_ALERT_TEXT:
103 (‘GET’, ‘/session/ s e s s i o n I d / a l e r t t e x t ′ ) , 104 C o m m a n d . W 3 C G E T A L E R T T E X T : 105 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/alert_text'), 104 Command.W3C_GET_ALERT_TEXT: 105 ('GET', '/session/ sessionId/alerttext),104Command.W3CGETALERTTEXT:105(GET,/session/sessionId/alert/text’),
106 Command.SET_ALERT_CREDENTIALS:
107 (‘POST’, ‘/session/ s e s s i o n I d / a l e r t / c r e d e n t i a l s ′ ) , 108 C o m m a n d . C L I C K : 109 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/alert/credentials'), 108 Command.CLICK: 109 ('POST', '/session/ sessionId/alert/credentials),108Command.CLICK:109(POST,/session/sessionId/click’),
110 Command.W3C_ACTIONS:
111 (‘POST’, ‘/session/ s e s s i o n I d / a c t i o n s ′ ) , 112 C o m m a n d . W 3 C C L E A R A C T I O N S : 113 ( ′ D E L E T E ′ , ′ / s e s s i o n / sessionId/actions'), 112 Command.W3C_CLEAR_ACTIONS: 113 ('DELETE', '/session/ sessionId/actions),112Command.W3CCLEARACTIONS:113(DELETE,/session/sessionId/actions’),
114 Command.DOUBLE_CLICK:
115 (‘POST’, ‘/session/ s e s s i o n I d / d o u b l e c l i c k ′ ) , 116 C o m m a n d . M O U S E D O W N : 117 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/doubleclick'), 116 Command.MOUSE_DOWN: 117 ('POST', '/session/ sessionId/doubleclick),116Command.MOUSEDOWN:117(POST,/session/sessionId/buttondown’),
118 Command.MOUSE_UP:
119 (‘POST’, ‘/session/ s e s s i o n I d / b u t t o n u p ′ ) , 120 C o m m a n d . M O V E T O : 121 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/buttonup'), 120 Command.MOVE_TO: 121 ('POST', '/session/ sessionId/buttonup),120Command.MOVETO:121(POST,/session/sessionId/moveto’),
122 Command.GET_WINDOW_SIZE:
123 (‘GET’, ‘/session/ s e s s i o n I d / w i n d o w / sessionId/window/ sessionId/window/windowHandle/size’),
124 Command.SET_WINDOW_SIZE:
125 (‘POST’, ‘/session/ s e s s i o n I d / w i n d o w / sessionId/window/ sessionId/window/windowHandle/size’),
126 Command.GET_WINDOW_POSITION:
127 (‘GET’, ‘/session/ s e s s i o n I d / w i n d o w / sessionId/window/ sessionId/window/windowHandle/position’),
128 Command.SET_WINDOW_POSITION:
129 (‘POST’, ‘/session/ s e s s i o n I d / w i n d o w / sessionId/window/ sessionId/window/windowHandle/position’),
130 Command.SET_WINDOW_RECT:
131 (‘POST’, ‘/session/ s e s s i o n I d / w i n d o w / r e c t ′ ) , 132 C o m m a n d . G E T W I N D O W R E C T : 133 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/window/rect'), 132 Command.GET_WINDOW_RECT: 133 ('GET', '/session/ sessionId/window/rect),132Command.GETWINDOWRECT:133(GET,/session/sessionId/window/rect’),
134 Command.MAXIMIZE_WINDOW:
135 (‘POST’, ‘/session/ s e s s i o n I d / w i n d o w / sessionId/window/ sessionId/window/windowHandle/maximize’),
136 Command.W3C_MAXIMIZE_WINDOW:
137 (‘POST’, ‘/session/ s e s s i o n I d / w i n d o w / m a x i m i z e ′ ) , 138 C o m m a n d . S E T S C R E E N O R I E N T A T I O N : 139 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/window/maximize'), 138 Command.SET_SCREEN_ORIENTATION: 139 ('POST', '/session/ sessionId/window/maximize),138Command.SETSCREENORIENTATION:139(POST,/session/sessionId/orientation’),
140 Command.GET_SCREEN_ORIENTATION:
141 (‘GET’, ‘/session/ s e s s i o n I d / o r i e n t a t i o n ′ ) , 142 C o m m a n d . S I N G L E T A P : 143 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/orientation'), 142 Command.SINGLE_TAP: 143 ('POST', '/session/ sessionId/orientation),142Command.SINGLETAP:143(POST,/session/sessionId/touch/click’),
144 Command.TOUCH_DOWN:
145 (‘POST’, ‘/session/ s e s s i o n I d / t o u c h / d o w n ′ ) , 146 C o m m a n d . T O U C H U P : 147 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/touch/down'), 146 Command.TOUCH_UP: 147 ('POST', '/session/ sessionId/touch/down),146Command.TOUCHUP:147(POST,/session/sessionId/touch/up’),
148 Command.TOUCH_MOVE:
149 (‘POST’, ‘/session/ s e s s i o n I d / t o u c h / m o v e ′ ) , 150 C o m m a n d . T O U C H S C R O L L : 151 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/touch/move'), 150 Command.TOUCH_SCROLL: 151 ('POST', '/session/ sessionId/touch/move),150Command.TOUCHSCROLL:151(POST,/session/sessionId/touch/scroll’),
152 Command.DOUBLE_TAP:
153 (‘POST’, ‘/session/ s e s s i o n I d / t o u c h / d o u b l e c l i c k ′ ) , 154 C o m m a n d . L O N G P R E S S : 155 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/touch/doubleclick'), 154 Command.LONG_PRESS: 155 ('POST', '/session/ sessionId/touch/doubleclick),154Command.LONGPRESS:155(POST,/session/sessionId/touch/longclick’),
156 Command.FLICK:
157 (‘POST’, ‘/session/ s e s s i o n I d / t o u c h / f l i c k ′ ) , 158 C o m m a n d . E X E C U T E S Q L : 159 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/touch/flick'), 158 Command.EXECUTE_SQL: 159 ('POST', '/session/ sessionId/touch/flick),158Command.EXECUTESQL:159(POST,/session/sessionId/execute_sql’),
160 Command.GET_LOCATION:
161 (‘GET’, ‘/session/ s e s s i o n I d / l o c a t i o n ′ ) , 162 C o m m a n d . S E T L O C A T I O N : 163 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/location'), 162 Command.SET_LOCATION: 163 ('POST', '/session/ sessionId/location),162Command.SETLOCATION:163(POST,/session/sessionId/location’),
164 Command.GET_APP_CACHE:
165 (‘GET’, ‘/session/ s e s s i o n I d / a p p l i c a t i o n c a c h e ′ ) , 166 C o m m a n d . G E T A P P C A C H E S T A T U S : 167 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/application_cache'), 166 Command.GET_APP_CACHE_STATUS: 167 ('GET', '/session/ sessionId/applicationcache),166Command.GETAPPCACHESTATUS:167(GET,/session/sessionId/application_cache/status’),
168 Command.CLEAR_APP_CACHE:
169 (‘DELETE’, ‘/session/ s e s s i o n I d / a p p l i c a t i o n c a c h e / c l e a r ′ ) , 170 C o m m a n d . G E T N E T W O R K C O N N E C T I O N : 171 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/application_cache/clear'), 170 Command.GET_NETWORK_CONNECTION: 171 ('GET', '/session/ sessionId/applicationcache/clear),170Command.GETNETWORKCONNECTION:171(GET,/session/sessionId/network_connection’),
172 Command.SET_NETWORK_CONNECTION:
173 (‘POST’, ‘/session/ s e s s i o n I d / n e t w o r k c o n n e c t i o n ′ ) , 174 C o m m a n d . G E T L O C A L S T O R A G E I T E M : 175 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/network_connection'), 174 Command.GET_LOCAL_STORAGE_ITEM: 175 ('GET', '/session/ sessionId/networkconnection),174Command.GETLOCALSTORAGEITEM:175(GET,/session/sessionId/local_storage/key/ k e y ′ ) , 176 C o m m a n d . R E M O V E L O C A L S T O R A G E I T E M : 177 ( ′ D E L E T E ′ , ′ / s e s s i o n / key'), 176 Command.REMOVE_LOCAL_STORAGE_ITEM: 177 ('DELETE', '/session/ key),176Command.REMOVELOCALSTORAGEITEM:177(DELETE,/session/sessionId/local_storage/key/ k e y ′ ) , 178 C o m m a n d . G E T L O C A L S T O R A G E K E Y S : 179 ( ′ G E T ′ , ′ / s e s s i o n / key'), 178 Command.GET_LOCAL_STORAGE_KEYS: 179 ('GET', '/session/ key),178Command.GETLOCALSTORAGEKEYS:179(GET,/session/sessionId/local_storage’),
180 Command.SET_LOCAL_STORAGE_ITEM:
181 (‘POST’, ‘/session/ s e s s i o n I d / l o c a l s t o r a g e ′ ) , 182 C o m m a n d . C L E A R L O C A L S T O R A G E : 183 ( ′ D E L E T E ′ , ′ / s e s s i o n / sessionId/local_storage'), 182 Command.CLEAR_LOCAL_STORAGE: 183 ('DELETE', '/session/ sessionId/localstorage),182Command.CLEARLOCALSTORAGE:183(DELETE,/session/sessionId/local_storage’),
184 Command.GET_LOCAL_STORAGE_SIZE:
185 (‘GET’, ‘/session/ s e s s i o n I d / l o c a l s t o r a g e / s i z e ′ ) , 186 C o m m a n d . G E T S E S S I O N S T O R A G E I T E M : 187 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/local_storage/size'), 186 Command.GET_SESSION_STORAGE_ITEM: 187 ('GET', '/session/ sessionId/localstorage/size),186Command.GETSESSIONSTORAGEITEM:187(GET,/session/sessionId/session_storage/key/ k e y ′ ) , 188 C o m m a n d . R E M O V E S E S S I O N S T O R A G E I T E M : 189 ( ′ D E L E T E ′ , ′ / s e s s i o n / key'), 188 Command.REMOVE_SESSION_STORAGE_ITEM: 189 ('DELETE', '/session/ key),188Command.REMOVESESSIONSTORAGEITEM:189(DELETE,/session/sessionId/session_storage/key/ k e y ′ ) , 190 C o m m a n d . G E T S E S S I O N S T O R A G E K E Y S : 191 ( ′ G E T ′ , ′ / s e s s i o n / key'), 190 Command.GET_SESSION_STORAGE_KEYS: 191 ('GET', '/session/ key),190Command.GETSESSIONSTORAGEKEYS:191(GET,/session/sessionId/session_storage’),
192 Command.SET_SESSION_STORAGE_ITEM:
193 (‘POST’, ‘/session/ s e s s i o n I d / s e s s i o n s t o r a g e ′ ) , 194 C o m m a n d . C L E A R S E S S I O N S T O R A G E : 195 ( ′ D E L E T E ′ , ′ / s e s s i o n / sessionId/session_storage'), 194 Command.CLEAR_SESSION_STORAGE: 195 ('DELETE', '/session/ sessionId/sessionstorage),194Command.CLEARSESSIONSTORAGE:195(DELETE,/session/sessionId/session_storage’),
196 Command.GET_SESSION_STORAGE_SIZE:
197 (‘GET’, ‘/session/ s e s s i o n I d / s e s s i o n s t o r a g e / s i z e ′ ) , 198 C o m m a n d . G E T L O G : 199 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/session_storage/size'), 198 Command.GET_LOG: 199 ('POST', '/session/ sessionId/sessionstorage/size),198Command.GETLOG:199(POST,/session/sessionId/log’),
200 Command.GET_AVAILABLE_LOG_TYPES:
201 (‘GET’, ‘/session/ s e s s i o n I d / l o g / t y p e s ′ ) , 202 C o m m a n d . C U R R E N T C O N T E X T H A N D L E : 203 ( ′ G E T ′ , ′ / s e s s i o n / sessionId/log/types'), 202 Command.CURRENT_CONTEXT_HANDLE: 203 ('GET', '/session/ sessionId/log/types),202Command.CURRENTCONTEXTHANDLE:203(GET,/session/sessionId/context’),
204 Command.CONTEXT_HANDLES:
205 (‘GET’, ‘/session/ s e s s i o n I d / c o n t e x t s ′ ) , 206 C o m m a n d . S W I T C H T O C O N T E X T : 207 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/contexts'), 206 Command.SWITCH_TO_CONTEXT: 207 ('POST', '/session/ sessionId/contexts),206Command.SWITCHTOCONTEXT:207(POST,/session/sessionId/context’),
208 Command.FULLSCREEN_WINDOW:
209 (‘POST’, ‘/session/ s e s s i o n I d / w i n d o w / f u l l s c r e e n ′ ) , 210 C o m m a n d . M I N I M I Z E W I N D O W : 211 ( ′ P O S T ′ , ′ / s e s s i o n / sessionId/window/fullscreen'), 210 Command.MINIMIZE_WINDOW: 211 ('POST', '/session/ sessionId/window/fullscreen),210Command.MINIMIZEWINDOW:211(POST,/session/sessionId/window/minimize’)
212 }

这个类里面定义了所有的selenium操作需要的接口地址(这些接口地址全部封装在浏览器驱动程序中),那么所有的浏览器操作就是通过访问这些接口来实现的

其中 Command.GET: (‘POST’, ‘/session/$sessionId/url’) 这个地址就是实现访问一个网址的url ,我们先记录一下后面有用

ok,所有的操作对应接口地址我们知道了,那么又怎样执行这些接口来达到在浏览器上实现各种操作呢?继续看紧接着接口地址定义下面的源码

1 def execute(self, command, params):
2 “”"
3 Send a command to the remote server.
4
5 Any path subtitutions required for the URL mapped to the command should be
6 included in the command parameters.
7
8 :Args:
9 - command - A string specifying the command to execute.
10 - params - A dictionary of named parameters to send with the command as
11 its JSON payload.
12 “”"
13 command_info = self._commands[command]
14 assert command_info is not None, ‘Unrecognised command %s’ % command
15 path = string.Template(command_info[1]).substitute(params)
16 if hasattr(self, ‘w3c’) and self.w3c and isinstance(params, dict) and ‘sessionId’ in params:
17 del params[‘sessionId’]
18 data = utils.dump_json(params)
19 url = ‘%s%s’ % (self._url, path)
20 return self._request(command_info[0], url, body=data)
21
22 def _request(self, method, url, body=None):
23 “”"
24 Send an HTTP request to the remote server.
25
26 :Args:
27 - method - A string for the HTTP method to send the request with.
28 - url - A string for the URL to send the request to.
29 - body - A string for request body. Ignored unless method is POST or PUT.
30
31 :Returns:
32 A dictionary with the server’s parsed JSON response.
33 “”"
34 LOGGER.debug(‘%s %s %s’ % (method, url, body))
35
36 parsed_url = parse.urlparse(url)
37 headers = self.get_remote_connection_headers(parsed_url, self.keep_alive)
38 resp = None
39 if body and method != ‘POST’ and method != ‘PUT’:
40 body = None
41
42 if self.keep_alive:
43 resp = self._conn.request(method, url, body=body, headers=headers)
44
45 statuscode = resp.status
46 else:
47 http = urllib3.PoolManager(timeout=self._timeout)
48 resp = http.request(method, url, body=body, headers=headers)
49
50 statuscode = resp.status
51 if not hasattr(resp, ‘getheader’):
52 if hasattr(resp.headers, ‘getheader’):
53 resp.getheader = lambda x: resp.headers.getheader(x)
54 elif hasattr(resp.headers, ‘get’):
55 resp.getheader = lambda x: resp.headers.get(x)
56
57 data = resp.data.decode(‘UTF-8’)
58 try:
59 if 300 <= statuscode < 304:
60 return self._request(‘GET’, resp.getheader(‘location’))
61 if 399 < statuscode <= 500:
62 return {‘status’: statuscode, ‘value’: data}
63 content_type = []
64 if resp.getheader(‘Content-Type’) is not None:
65 content_type = resp.getheader(‘Content-Type’).split(‘;’)
66 if not any([x.startswith(‘image/png’) for x in content_type]):
67
68 try:
69 data = utils.load_json(data.strip())
70 except ValueError:
71 if 199 < statuscode < 300:
72 status = ErrorCode.SUCCESS
73 else:
74 status = ErrorCode.UNKNOWN_ERROR
75 return {‘status’: status, ‘value’: data.strip()}
76
77 # Some of the drivers incorrectly return a response
78 # with no ‘value’ field when they should return null.
79 if ‘value’ not in data:
80 data[‘value’] = None
81 return data
82 else:
83 data = {‘status’: 0, ‘value’: data}
84 return data
85 finally:
86 LOGGER.debug(“Finished Request”)
87 resp.close()

可以看到主要是通过execute方法调用_request方法通过urilib3标准库向服务器发送对应操作请求地址,进而实现了浏览器各种操作

有人会问打开浏览器和操作浏览器实现各种动作是怎么关联的呢?

其实,打开浏览器也是发送请求,请求会返回一个sessionid,后面操作的各种接口地址,你也会发现接口地址中存在一个变量$sessionid,那么不难猜测打开浏览器和操作浏览器就是用过sessionid关联到一起,达到在同一个浏览器中做操作

第二步在浏览其上实现各种操作原理也完成了

八、模拟selenium

现在我们可以通过下面的一段代码查看一下打开浏览器和访问我的博客首页的请求参数是什么样子的

“”"

@Time : 2019/6/29 9:16
@Auth : linux超
@File : seleniumWebdriver.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760

“”"
from selenium import webdriver
import logging

logging.basicConfig(level=logging.DEBUG) # 打印源码中的日志
dr = webdriver.Chrome() # 打开浏览器
driver.get(“https://www.cnblogs.com/linuxchao/”) # 访问我的博客首页

输出日志信息

DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:55695/session
{“capabilities”: {“firstMatch”: [{}], “alwaysMatch”: {“browserName”: “chrome”, “platformName”: “any”, “goog:chromeOptions”:
{“extensions”: [], “args”: []}}}, “desiredCapabilities”: {“browserName”: “chrome”, “version”: “”, “platform”: “ANY”,
“goog:chromeOptions”: {“extensions”: [], “args”: []}}}
DEBUG:urllib3.connectionpool:Starting new HTTP connection (1): 127.0.0.1
DEBUG:urllib3.connectionpool:http://127.0.0.1:55695 “POST /session HTTP/1.1” 200 830
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
DEBUG:selenium.webdriver.remote.remote_connection:POST http://127.0.0.1:51006/session/09d52393b7dfcb45b8bb9101885ce206/url
{“url”: “https://www.cnblogs.com/linuxchao/”, “sessionId”: “09d52393b7dfcb45b8bb9101885ce206”}
DEBUG:urllib3.connectionpool:http://127.0.0.1:51006 “POST /session/09d52393b7dfcb45b8bb9101885ce206/url HTTP/1.1” 200 72
DEBUG:selenium.webdriver.remote.remote_connection:Finished Request
Process finished with exit code 0

通过执行结果就很明显明白selenium执行的过程了,程序告诉RemoteWebDriver打开一个浏览器(发送post请求,带上请求参数),然后再向remote server发送执行浏览器动作的请求

那么为了更加深入理解selenium实现自动化测试的过程,我们可以自己编写程序模拟一下打开浏览器然后控制浏览器访问我的博客地址的操作过程

首先我们需要保持浏览器的驱动程序打开状态,然后编写如下代码并执行

“”"

@Time : 2019/6/28 8:52
@Auth : linux超
@File : test.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760

“”"
import requests

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
img

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!
序打开状态,然后编写如下代码并执行

“”"

@Time : 2019/6/28 8:52
@Auth : linux超
@File : test.py
@IDE : PyCharm
@Motto: Real warriors,dare to face the bleak warning,dare to face the incisive error!
@QQ : 28174043@qq.com
@GROUP: 878565760

“”"
import requests

网上学习资料一大堆,但如果学到的知识不成体系,遇到问题时只是浅尝辄止,不再深入研究,那么很难做到真正的技术提升。

需要这份系统化的资料的朋友,可以添加V获取:vip1024b (备注软件测试)
[外链图片转存中…(img-SS3RO2IK-1713219607570)]

一个人可以走的很快,但一群人才能走的更远!不论你是正从事IT行业的老鸟或是对IT行业感兴趣的新人,都欢迎加入我们的的圈子(技术交流、学习资源、职场吐槽、大厂内推、面试辅导),让我们一起学习成长!

  • 12
    点赞
  • 28
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
好的,关于您的问题,我可以给您提供以下的实例代码,使用selenium-java web自动化测试工具来抓取百度搜索结果: ``` import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.openqa.selenium.WebElement; import org.openqa.selenium.chrome.ChromeDriver; public class BaiduSearch { public static void main(String[] args) { // 设置驱动程序路径 System.setProperty("webdriver.chrome.driver", "/path/to/chromedriver"); // 创建一个新的WebDriver对象 WebDriver driver = new ChromeDriver(); // 访问百度首页 driver.get("https://www.baidu.com/"); // 找到输入框并输入搜索关键词 WebElement input = driver.findElement(By.id("kw")); input.sendKeys("Java抓取百度搜索结果"); // 提交搜索请求 input.submit(); // 等待搜索结果页面加载完成 try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } // 打印搜索结果标题和URL WebElement result = driver.findElement(By.cssSelector("#content_left .result")); String title = result.findElement(By.cssSelector(".t a")).getText(); String url = result.findElement(By.cssSelector(".t a")).getAttribute("href"); System.out.println(title + " - " + url); // 关闭浏览器 driver.quit(); } } ``` 请注意,此代码仅演示如何使用selenium-java工具抓取百度搜索结果。实际上,使用自动化测试工具抓取搜索结果可能会违反搜索引擎的服务条款,因为这可能是一种滥用搜索引擎的行为。因此,在实际应用中,应该遵守搜索引擎的服务条款,并且仅在合法的情况下使用自动化测试工具来抓取搜索结果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值