关于Python的Selenium框架全解,一篇完整的说明书

安装 selenium 第三方库

<span class="hljs-attribute">pip install selenium</span>

下载浏览器驱动:

  • Firefox浏览器驱动: geckodriver
  • Chrome浏览器驱动: chromedriver , taobao备用地址
  • IE浏览器驱动: IEDriverServer
  • Edge浏览器驱动: MicrosoftWebDriver
  • Opera浏览器驱动: operadriver
  • PhantomJS浏览器驱动: phantomjs

需要把这些浏览器驱动放入 Python 应用目录里面的 Script 文件夹里面

① 200 多本 Python 电子书(和经典的书籍)应该有

② Python标准库资料(最全中文版)

③ 项目源码(四五十个有趣且可靠的练手项目及源码)

④ Python基础入门、爬虫、网络开发、大数据分析方面的视频(适合小白学习)

⑤ Python学习路线图(告别不入流的学习)

每次当selenium启动chrome浏览器的时候,chrome浏览器很干净,没有插件、没有收藏、没有历史记录,这是因为selenium在启动chrome时为了保证最快的运行效率,启动了一个裸浏览器,这就是为什么需要配置参数的原因,但是有些时候我们需要的不仅是一个裸浏览器

selenium启动配置参数接收是ChromeOptions类,创建方式如下 :

<span class="hljs-attr">from <span class="hljs-string">selenium import webdriver
<span class="hljs-attr">option = <span class="hljs-string">webdriver.ChromeOptions()
<span class="hljs-attr">driver = <span class="hljs-string">webdriver.Chrome(chrome_options=option)</span></span></span></span></span></span>

创建了ChromeOptions类之后就是添加参数,添加参数有几个特定的方法,分别对应添加不同类型的配置项目

<span class="hljs-keyword">from selenium <span class="hljs-keyword">import webdriver
option = webdriver.ChromeOptions()

</span></span>

常用配置参数:

<span class="hljs-keyword">from selenium <span class="hljs-keyword">import webdriver
option = webdriver.ChromeOptions()

</span></span>

其他配置项目参数

&#x2013;user-data-dir=&#x201D;[PATH]&#x201D;

制作无头浏览器

规避检测

门户网站检测如果是selenium请求的,有可能会拒绝访问。这也是一种反爬机制

实现规避检测

<span class="hljs-keyword">from selenium <span class="hljs-keyword">import webdriver
<span class="hljs-keyword">from selenium.webdriver <span class="hljs-keyword">import ChromeOptions

options = ChromeOptions()
options.add_experimental_option(<span class="hljs-string">'excludeSwitcher', [<span class="hljs-string">'enable-automation'])
driver = webdriver.Chrome(options=options)</span></span></span></span></span></span>

注意:这里只能使用 options 添加

如果有其他的模块要添加,注意要分开添加

from selenium import webdriver

driver = webdriver.Firefox()

元素定位语法

常用语法:

<span class="hljs-selector-tag">find_element_by_id()
<span class="hljs-selector-tag">find_element_by_name()
<span class="hljs-selector-tag">find_element_by_class_name()
<span class="hljs-selector-tag">find_element_by_tag_name()
<span class="hljs-selector-tag">find_element_by_link_text()
<span class="hljs-selector-tag">find_element_by_partial_link_text()
<span class="hljs-selector-tag">find_element_by_xpath()
<span class="hljs-selector-tag">find_element_by_css_selector()</span></span></span></span></span></span></span></span>

在 element 变成 elements 时,返回符合条件的所有元素组成的数组

控制浏览器大小

  • driver.set_window_size(480, 800)

浏览器后退,前进

<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.forward()
<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.back()
</span></span></span></span>
  • driver.refresh()
<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.find_element_by_id(<span class="hljs-string">"kw")<span class="hljs-selector-class">.clear() # &#x6E05;&#x7A7A;&#x6587;&#x672C;
<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.find_element_by_id(<span class="hljs-string">"kw")<span class="hljs-selector-class">.send_keys(<span class="hljs-string">"selenium") # &#x6A21;&#x62DF;&#x6309;&#x952E;&#x8F93;&#x5165;
<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.find_element_by_id(<span class="hljs-string">"su")<span class="hljs-selector-class">.click() # &#x5355;&#x51FB;&#x5143;&#x7D20;</span></span></span></span></span></span></span></span></span></span></span></span></span>

在搜索框模拟回车操作

<span class="hljs-attr">search_text = driver.find_element_by_id(<span class="hljs-string">'kw') search_text.send_keys(<span class="hljs-string">'selenium') search_text.submit()  </span></span></span>
drive.size

在 WebDriver 中, 将这些关于鼠标操作的方法封装在 ActionChains 类提供

ActionChains 类提供了鼠标操作的常用方法:

<span class="hljs-selector-tag">click(on_element=None) &#x2014;&#x2014;&#x5355;&#x51FB;&#x9F20;&#x6807;&#x5DE6;&#x952E;

<span class="hljs-selector-tag">click_and_hold(on_element=None) &#x2014;&#x2014;&#x70B9;&#x51FB;&#x9F20;&#x6807;&#x5DE6;&#x952E;&#xFF0C;&#x4E0D;&#x677E;&#x5F00;

<span class="hljs-selector-tag">context_click(on_element=None) &#x2014;&#x2014;&#x70B9;&#x51FB;&#x9F20;&#x6807;&#x53F3;&#x952E;

<span class="hljs-selector-tag">double_click(on_element=None) &#x2014;&#x2014;&#x53CC;&#x51FB;&#x9F20;&#x6807;&#x5DE6;&#x952E;

<span class="hljs-selector-tag">drag_and_drop(source, target) &#x2014;&#x2014;&#x62D6;&#x62FD;&#x5230;&#x67D0;&#x4E2A;&#x5143;&#x7D20;&#x7136;&#x540E;&#x677E;&#x5F00;

<span class="hljs-selector-tag">drag_and_drop_by_offset(source, xoffset, yoffset) &#x2014;&#x2014;&#x62D6;&#x62FD;&#x5230;&#x67D0;&#x4E2A;&#x5750;&#x6807;&#x7136;&#x540E;&#x677E;&#x5F00;

<span class="hljs-selector-tag">key_down(value, element=None) &#x2014;&#x2014;&#x6309;&#x4E0B;&#x67D0;&#x4E2A;&#x952E;&#x76D8;&#x4E0A;&#x7684;&#x952E;

<span class="hljs-selector-tag">key_up(value, element=None) &#x2014;&#x2014;&#x677E;&#x5F00;&#x67D0;&#x4E2A;&#x952E;

<span class="hljs-selector-tag">move_by_offset(xoffset, yoffset) &#x2014;&#x2014;&#x9F20;&#x6807;&#x4ECE;&#x5F53;&#x524D;&#x4F4D;&#x7F6E;&#x79FB;&#x52A8;&#x5230;&#x67D0;&#x4E2A;&#x5750;&#x6807;

<span class="hljs-selector-tag">move_to_element(to_element) &#x2014;&#x2014;&#x9F20;&#x6807;&#x79FB;&#x52A8;&#x5230;&#x67D0;&#x4E2A;&#x5143;&#x7D20;

<span class="hljs-selector-tag">move_to_element_with_offset(to_element, xoffset, yoffset) &#x2014;&#x2014;&#x79FB;&#x52A8;&#x5230;&#x8DDD;&#x67D0;&#x4E2A;&#x5143;&#x7D20;&#xFF08;&#x5DE6;&#x4E0A;&#x89D2;&#x5750;&#x6807;&#xFF09;&#x591A;&#x5C11;&#x8DDD;&#x79BB;&#x7684;&#x4F4D;&#x7F6E;

<span class="hljs-selector-tag">perform() &#x2014;&#x2014;&#x6267;&#x884C;&#x94FE;&#x4E2D;&#x7684;&#x6240;&#x6709;&#x52A8;&#x4F5C;

<span class="hljs-selector-tag">release(on_element=None) &#x2014;&#x2014;&#x5728;&#x67D0;&#x4E2A;&#x5143;&#x7D20;&#x4F4D;&#x7F6E;&#x677E;&#x5F00;&#x9F20;&#x6807;&#x5DE6;&#x952E;

<span class="hljs-selector-tag">send_keys(*keys_to_send) &#x2014;&#x2014;&#x53D1;&#x9001;&#x67D0;&#x4E2A;&#x952E;&#x5230;&#x5F53;&#x524D;&#x7126;&#x70B9;&#x7684;&#x5143;&#x7D20;

<span class="hljs-selector-tag">send_keys_to_element(element, *keys_to_send) &#x2014;&#x2014;&#x53D1;&#x9001;&#x67D0;&#x4E2A;&#x952E;&#x5230;&#x6307;&#x5B9A;&#x5143;&#x7D20;</span></span></span></span></span></span></span></span></span></span></span></span></span></span></span>

语法:

from selenium.webdriver.common.action_chains import ActionChains

想使用selenium中的键盘事件,首先我们必须导入Keys包,需要注意的是包名称Keys首字母需要大写。Keys类中提供了几乎所有的键盘事件包括组合按键如 Ctrl+A、 Ctrl+C 等

使用语法:

<span class="hljs-attribute">from selenium.webdriver.common.keys import Keys

element.send_keys(&#x952E;&#x76D8;&#x4E8B;&#x4EF6;)

</span>

其他事件可以通过查看源码获取

<span class="hljs-attr">title = driver.title </span>

显式等待使WebdDriver等待某个条件成立时继续执行,否则在达到最大时长时抛出超时异常

实例:

<span class="hljs-keyword">from selenium <span class="hljs-keyword">import webdriver
<span class="hljs-keyword">from selenium.webdriver.common.<span class="hljs-keyword">by <span class="hljs-keyword">import By
<span class="hljs-keyword">from selenium.webdriver.support.ui <span class="hljs-keyword">import WebDriverWait
<span class="hljs-keyword">from selenium.webdriver.support <span class="hljs-keyword">import expected_conditions

driver = webdriver.Firefox()
driver.get(<span class="hljs-string">"http://www.baidu.com")

element = WebDriverWait(driver, <span class="hljs-number">5, <span class="hljs-number">0.5).<span class="hljs-keyword">until(
          expected_conditions.presence_of_element_located((By.ID, <span class="hljs-string">"kw"))
                      )  </span></span></span></span></span></span></span></span></span></span></span></span></span></span>

WebDriverWait类是由WebDirver 提供的等待方法。在设置时间内,默认每隔一段时间检测一次当前页面元素是否存在,如果超过设置时间检测不到则抛出异常

语法:

<span class="hljs-selector-tag">WebDriverWait(driver, timeout, poll_frequency=<span class="hljs-number">0.5, ignored_exceptions=None)</span></span>

参数:

  • driver :浏览器驱动
  • timeout :最长超时时间,默认以秒为单位
  • poll_frequency :检测的间隔(步长)时间,默认为0.5S
  • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常
  • WebDriverWait()一般由until()或until_not()方法配合使用until(method, message=”) :调用该方法提供的驱动程序作为一个参数,直到返回值为Trueuntil_not(method, message=”): 调用该方法提供的驱动程序作为一个参数,直到返回值为False

如果某些元素不是立即可用的,隐式等待是告诉WebDriver去等待一定的时间后去查找元素。 默认等待时间是0秒,一旦设置该值,隐式等待是设置该WebDriver的实例的生命周期

<span class="hljs-keyword">from selenium <span class="hljs-keyword">import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(<span class="hljs-number">10) </span></span></span>
driver.switch_to_window(<span class="hljs-string">"windowName")  </span>

语法:

<span class="hljs-attr">alert = driver.switch_to_alert()</span>

alert 里面的方法

  • text:返回 alert/confirm/prompt 中的文字信息
  • accept():接受现有警告框
  • dismiss():解散现有警告框
  • send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框
<span class="hljs-keyword">from selenium <span class="hljs-keyword">import webdriver
<span class="hljs-keyword">from selenium.webdriver.support.select <span class="hljs-keyword">import Select

driver = webdriver.Chrome()
driver.implicitly_wait(<span class="hljs-number">10)  </span></span></span></span></span>
<span class="hljs-string">"""
deselect_all()  &#x53D6;&#x6D88;&#x5168;&#x9009;
deselect_by_value(value)  &#x901A;&#x8FC7;value&#x5C5E;&#x6027;&#x53D6;&#x6D88;&#x9009;&#x62E9;
deselect_by_index(index)  &#x901A;&#x8FC7;index&#x53D6;&#x6D88;&#x9009;&#x62E9;
deselect_by_visible_text(text)  &#x901A;&#x8FC7;text&#x53D6;&#x6D88;&#x9009;&#x62E9;
"""
</span>
<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.find_element_by_name(<span class="hljs-string">"file")<span class="hljs-selector-class">.send_keys(<span class="hljs-string">'D:\\upload_file.txt')  # &#x5B9A;&#x4F4D;&#x4E0A;&#x4F20;&#x6309;&#x94AE;&#xFF0C;&#x6DFB;&#x52A0;&#x672C;&#x5730;&#x6587;&#x4EF6;</span></span></span></span></span>

WebDriver操作cookie的方法:

<span class="hljs-selector-tag">get_cookies()
<span class="hljs-selector-tag">get_cookie(name)
<span class="hljs-selector-tag">add_cookie(cookie_dict)
<span class="hljs-selector-tag">delete_cookie(name,optionsString)
<span class="hljs-selector-tag">delete_all_cookies()
</span></span></span></span></span>

参考链接:
https://www.jianshu.com/p/773c58406bdb

<span class="hljs-selector-tag">for <span class="hljs-selector-tag">item <span class="hljs-selector-tag">in <span class="hljs-selector-tag">cookies:
    <span class="hljs-selector-tag">driver<span class="hljs-selector-class">.add_cookie(<span class="hljs-selector-tag">item)</span></span></span></span></span></span></span>

与普通的在headers里添加 {‘Cookies’:’ ‘} 不一样的是,此方法需要按照cookie的name,value,path,domain格式逐个cookie添加

js=<span class="hljs-string">"window.scrollTo(100,450);"
driver.execute_script(js) </span>

通过execute_script()方法执行JavaScripts代码来移动滚动条的位置

driver.get_screenshot_as_file(<span class="hljs-string">"D:\\baidu_img.jpg") </span>
<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.close()
<span class="hljs-selector-tag">driver<span class="hljs-selector-class">.quit() </span></span></span></span>

Original: https://www.cnblogs.com/sn5200/p/15949796.html
Author: Python可乐的呀
Title: 关于Python的Selenium框架全解,一篇完整的说明书

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/814827/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球