96SEO 2026-02-20 05:42 0
selenium是网页应用中最流行的自动化测试工具可以用来做自动化测试或者浏览器爬虫等。

官网地址为相对于另外一款web自动化测试工具QTP来说有如下优点
免费开源轻量级不同语言只需要一个体积很小的依赖包支持多种系统包括WindowsMacLinux支持多种浏览器包括ChromeFireFoxIEsafariopera等支持多语言包括JavaCpythonc#等主流语言支持分布式测试用例执行
另外还需要下载浏览器相应的webdriver驱动程序注意下载的驱动版本一定要匹配浏览器版本。
Firefox浏览器驱动Chrome浏览器驱动IE浏览器驱动Edge浏览器驱动Opera浏览器驱动
下载以后可以把驱动程序加到环境变量这样使用时就不用手动指定驱动程序路径。
可以在python中使用下面的代码启动一个Chrome浏览器然后控制这个浏览器的行为或者读取数据。
启动Chrome浏览器要求chromedriver驱动程序已经配置到环境变量
webdriver.Chrome(rD:/uusama/tools/chromedriver.exe)driver
PhantomJSdriver.get(http://uusama.com)
启动的时候还可以设置启动参数比如下面的代码实现启动时添加代理并且忽略https证书校验。
webdriver.ChromeOptions()options.add_argument(--proxy-server127.0.0.1:16666)
options.add_argument(---ignore-certificate-errors)
options.add_experimental_option(excludeSwitches,
options.add_experimental_option(prefs,
webdriver.Chrome(optionsoptions)
启动的时候还可以设置启动参数比如下面的代码实现启动时添加代理并且忽略https证书校验。
webdriver.ChromeOptions()options.add_argument(--proxy-server127.0.0.1:16666)
options.add_argument(---ignore-certificate-errors)
options.add_experimental_option(excludeSwitches,
options.add_experimental_option(prefs,
webdriver.Chrome(optionsoptions)
options.add_argument(--proxy-server127.0.0.1:16666):
设置代理可以结合mitmproxy进行抓包等option.add_experimental_option(excludeSwitches,
设置绕过selenium检测options.add_argument(---ignore-certificate-errors):
设置忽略https证书校验options.add_experimental_option(prefs,
{profile.managed_default_content_settings.images:
设置不请求图片模式加快页面加载速度chrome_options.add_argument(--headless):
使用selenium打开页面以后还不能立刻操作需要等到待处理页面元素加载完成这时就需要检测和等待页面元素加载。
最简单的方法就是打开页面以后使用time.sleep()强制等待一定时间该方法只能设置一个固定时间等待如果页面提前加载完成则会空等阻塞。
另外还可以使用implicitly_wait设置最长等待时间如果在给定时间内页面加载完成或者已经超时才会执行下一步。
该方法会等到所有资源全部加载完成也就是浏览器标签栏的loading图表不再转才会执行下一步。
有可能页面元素已经加载完成但是js或者图片等资源还未加载完成此时还需要等待。
另需注意使用implicitly_wait只需设置一次且对整个driver生命周期都起作用凡是遇到页面正在加载都会阻塞。
print(driver.current_url)driver.get(http://baidu.com)
使用WebDriverWaitselenium.webdriver.support.wait.WebDriverWait能够更加精确灵活地设置等待时间WebDriverWait可在设定时间内每隔一段时间检测是否满足某个条件如果满足条件则进行下一步操作如果超过设置时间还不满足则抛出TimeoutException异常其方法声明如下
driver浏览器驱动timeout最长超时时间默认以秒为单位poll_frequency检测的间隔步长时间默认为0.5秒ignored_exceptions忽略的异常即使在调用until()或until_not()的过程中抛出给定异常也不中断
WebDriverWait()一般配合until()或until_not()方法使用表示等待阻塞直到返回值为True或者False需要注意这两个方法的参数都需是可调用对象即方法名称可以使用expected_conditions模块中的方法或者自己封装的方法。
判断id为input的元素是否被加到了dom树里并不代表该元素一定可见如果定位到就返回WebElement
0.5).until(expected_conditions.presence_of_element_located((By.ID,
implicitly_wait和WebDriverWait都设置时取二者中最大的等待时间
判断某个元素是否被添加到了dom里并且可见可见代表元素可显示且宽和高都大于0
WebDriverWait(driver,10).until(EC.visibility_of_element_located((By.ID,
WebDriverWait(driver,10).until(EC.visibility_of(driver.find_element(byBy.ID,
判断当前页面title是否精确等于预期title_contains:
判断当前页面title是否包含预期字符串presence_of_element_located:
判断某个元素是否被加到了dom树里并不代表该元素一定可见visibility_of_element_located:
判断某个元素是否可见元素非隐藏并且元素的宽和高都不等于0visibility_of:
跟上面的方法做一样的事情只是上面的方法要传入locator这个方法直接传定位到的element就好了presence_of_all_elements_located:
判断是否至少有1个元素存在于dom树中。
举个例子如果页面上有n个元素的class都是column-md-3那么只要有1个元素存在这个方法就返回Truetext_to_be_present_in_element:
判断某个元素中的text是否包含了预期的字符串text_to_be_present_in_element_value:
判断某个元素中的value属性是否包含了预期的字符串frame_to_be_available_and_switch_to_it:
判断该frame是否可以switch进去如果可以的话返回True并且switch进去否则返回Falseinvisibility_of_element_located:
判断某个元素中是否不存在于dom树或不可见element_to_be_clickable:
判断某个元素中是否可见并且是enable的这样的话才叫clickablestaleness_of:
等某个元素从dom树中移除注意这个方法也是返回True或Falseelement_to_be_selected:
判断某个元素是否被选中了,一般用在下拉列表element_selection_state_to_be:
判断某个元素的选中状态是否符合预期element_located_selection_state_to_be:
跟上面的方法作用一样只是上面的方法传入定位到的element而这个方法传入locator
另外还可以使用driver.execute_script(return
注意document加载完成是不包括那种异步加载ajax请求动态渲染dom的这种需要使用WebDriverWait检测某个元素是否渲染完成。
selenium提供了一系列api方便获取chrome中的元素这些API都返回WebElement对象或其列表如
查找匹配id的第一个元素find_element_by_class_name():
查找匹配class的第一个元素find_elements_by_xpath():
查找匹配xpath的所有元素find_elements_by_css_selector():
其实可以看WebDriver类里面的实现源码其核心实现都是调用两个基本函数
查找匹配策略的第一个元素find_elements(self,
find_element_by_xpath(//*[contains(text(),登录)])查询包含类名refresh的所有元素
find_elements_by_class_name(refresh)查询table表格的第二行
find_element_by_css_selector(table
上面介绍的元素查找结果WebElement对象常用的api有:
返回元素的文本内容包括所有后代节点的内容注意如果元素displaynone则返回为空字符串element.screenshot_as_png:
元素输入框输入input字符串element.get_attribute(data-v):
获取data-v名称属性值除了自定义节点属性还可以获取如textContent等属性element.is_displayed():
点击元素如果元素不可点击会抛出ElementNotInteractableException异常element.submit():
如果找不到指定元素则会抛出NoSuchElementException异常而且需要注意displaynone的元素是可以获取到的凡是在dom节点中的元素都可以获取到。
而且实际使用的时候要注意一些js代码动态创建的元素可能需要轮询获取或者监控。
check_element_exists(xpath):try:driver.find_element_by_xpath(xpath)except
webdriver通过ActionChains对象来模拟用户操作该对象表示一个动作链路队列所有操作会依次进入队列但不会立即执行直到调用perform()方法时才会执行。
其常用方法如下
单击鼠标左键click_and_hold(on_elementNone):
点击鼠标左键不松开context_click(on_elementNone):
点击鼠标右键double_click(on_elementNone):
双击鼠标左键send_keys(*keys_to_send):
发送某个键到当前焦点的元素send_keys_to_element(element,
拖拽到某个元素然后松开drag_and_drop_by_offset(source,
拖拽到某个坐标然后松开move_by_offset(xoffset,
鼠标从当前位置移动到某个坐标move_to_element(to_element):
鼠标移动到某个元素move_to_element_with_offset(to_element,
执行链中的所有动作release(on_elementNone):
下面代码模拟鼠标移动点击拖拽等操作注意操作时需要等待一定时间否则页面还来不及渲染。
selenium.webdriver.common.action_chains
driver.get(https://www.baidu.cn)
driver.find_element_by_link_text(搜索)
action_chains.move_to_element(target).click(target).perform()
action_chains.move_by_offset(10,
action_chains.move_to_element_with_offset(target,
driver.find_element_by_id(dragger)
action.click_and_hold(dragger).release(target).perform()
action.click_and_hold(dragger).move_to_element(target).release().perform()
删除键BackSpacesend_keys(Keys.SPACE):
制表键(Tab)send_keys(Keys.ESCAPE):
全选CtrlAsend_keys(Keys.CONTROL,c):
复制CtrlCsend_keys(Keys.CONTROL,x):
剪切CtrlXsend_keys(Keys.CONTROL,v):
driver.find_element_by_id(kw).send_keys(uusamaa)#
driver.find_element_by_id(kw).send_keys(Keys.BACK_SPACE)
切换到警告框text返回alert/confirm/prompt中的文字信息比如js调用alert(failed)则会获取failed字符串accept()接受现有警告框dismiss()关闭现有警告框send_keys(keysToSend)将文本发送至警告框
获取当前活动窗口的urldriver.switch_to_window(windowName):
移动到指定的标签窗口driver.switch_to_frame(frameName):
移动到指定名称的iframedriver.switch_to_default_content():
移动到默认文本内容区driver.maximize_window():
将浏览器最大化显示driver.set_window_size(480,
设置浏览器宽480、高800显示driver.forword(),
关闭整个浏览器driver.save_screenshot(screen.png):
保存页面截图driver.maximize_window():
将浏览器最大化显示browser.execute_script(return
使用get_cookies和add_cookie可以实现将cookie缓存到本地然后启动时加载这样可以保留登录态。
实现如下
driver.get(https://www.baidu.cn)#
cookies:driver.add_cookie(cookie)
使用driver.get(url)会默认在第一个标签窗口打开指定连接点击页面中的_blank的链接时也会打开一个新的标签窗口。
还可以用下面的方式手动打开一个指定页面的标签窗口需要注意打开新窗口或者关闭以后还需要手动调用switch_to.window切换当前活动的标签窗口否则会抛出NoSuchWindowException异常。
driver.get(https://www.baidu.cn)new_tab_url
driver.execute_script(fwindow.open({new_tab_url},
注意必须调用switch_to.window手动切换window否则会找不到tab
driver.switch_to.window(driver.window_handles[1])
driver.switch_to.window(driver.window_handles[0])
除了使用execute_script外还可以使用模拟打开新tab页按键的方式新建一个标签页窗口
driver.find_element_by_tag_name(body).send_keys(Keys.CONTROL
t)ActionChains(driver).key_down(Keys.CONTROL).send_keys(t).key_up(Keys.CONTROL).perform()
如果一个元素是隐藏的即displaynone虽然可以通过find_element查找到该元素但是用element.text属性是获取不到该元素文本内容的其值是空字符串这时可以用下面的方式获取
driver.find_element_by_id(uusama)
driver.execute_script(arguments[0].style.display
Memory内存不足的错误此时WebDriver会抛出WebDriverException异常基本所有api都会抛出这个异常这个时候需要捕获并进行特殊处理。
我的处理方式是记录页面的一些基本信息比如urlcookie等并定期写入到文件中如果检测到该异常则重启浏览器并且加载url和cookie等数据。
网上有通过driver.requests或者通过解析日志来获取页面请求的方式但是我感觉都不是很好使。
最后使用mitmproxy代理进行抓包处理然后启动selenium时填入代理来实现。
proxy.py为在mitmproxy基础上封装的自定义代理请求处理其代码如下
**kwargs):super().__init__(*args,
funcNone):try:DumpMaster.run(self,
KeyboardInterrupt:self.shutdown()def
flow.request.headers[Connection]
response_content.data.content.startswith(b\x1f\x8b\x08):response_content
gzip.decompress(response_content.data.content).decode(utf-8)Addon.EXECUTOR.submit(process,
ProxyServer(config)master.addons.add(Addon())master.run()if
fin:fin.write(os.getpid().__str__())run_proxy_server()
在使用mitmproxy过程中随着时间推移proxy.py会出现占用内存飙升的问题在github的issue区有人也遇到过有说是因为http连接keep-alivetrue请求会一直保存不会释放导致请求越多越占用内存然后通过添加flow.request.headers[Connection]
close来手动关闭连接我加了以后有一定缓解但还是不能从根本上解决。
最后通过写入proxy.pid记录代理程序进程然后用另外一个程序定时重启proxy.py来解决内存泄漏的问题。
同时在这我为大家准备了一份软件测试视频教程含面试、接口、自动化、性能测试等就在下方需要的可以直接去观看。
【2024最新版】Python自动化测试15天从入门到精通10个项目实战允许白嫖。
。
。
作为专业的SEO优化服务提供商,我们致力于通过科学、系统的搜索引擎优化策略,帮助企业在百度、Google等搜索引擎中获得更高的排名和流量。我们的服务涵盖网站结构优化、内容优化、技术SEO和链接建设等多个维度。
| 服务项目 | 基础套餐 | 标准套餐 | 高级定制 |
|---|---|---|---|
| 关键词优化数量 | 10-20个核心词 | 30-50个核心词+长尾词 | 80-150个全方位覆盖 |
| 内容优化 | 基础页面优化 | 全站内容优化+每月5篇原创 | 个性化内容策略+每月15篇原创 |
| 技术SEO | 基本技术检查 | 全面技术优化+移动适配 | 深度技术重构+性能优化 |
| 外链建设 | 每月5-10条 | 每月20-30条高质量外链 | 每月50+条多渠道外链 |
| 数据报告 | 月度基础报告 | 双周详细报告+分析 | 每周深度报告+策略调整 |
| 效果保障 | 3-6个月见效 | 2-4个月见效 | 1-3个月快速见效 |
我们的SEO优化服务遵循科学严谨的流程,确保每一步都基于数据分析和行业最佳实践:
全面检测网站技术问题、内容质量、竞争对手情况,制定个性化优化方案。
基于用户搜索意图和商业目标,制定全面的关键词矩阵和布局策略。
解决网站技术问题,优化网站结构,提升页面速度和移动端体验。
创作高质量原创内容,优化现有页面,建立内容更新机制。
获取高质量外部链接,建立品牌在线影响力,提升网站权威度。
持续监控排名、流量和转化数据,根据效果调整优化策略。
基于我们服务的客户数据统计,平均优化效果如下:
我们坚信,真正的SEO优化不仅仅是追求排名,而是通过提供优质内容、优化用户体验、建立网站权威,最终实现可持续的业务增长。我们的目标是与客户建立长期合作关系,共同成长。
Demand feedback