目录:

1. 常用操作

2. 查找元素

3. 操作Cookie

4. 获取截图

5. 获取窗口信息

6. 切换

7. 执行JS代码


简介

selenium.webdriver.remote.webdriver.WebDriver 这个类其实是所有其他Webdriver的父类,

例如Chrome WebdriverFirefox Webdriver都是继承自这个类。这个类中实现了每个Webdriver间相通的方法。


常用操作

- get(url)

  在当前浏览器会话中访问传入的url地址

driver.get("https://www.baidu.com")

- close()  

  关闭浏览器当前页面(只有当前的一个页面会被关闭)

driver.close()

- quit()

  退出webdriver并关闭所有窗口(推荐,这样退出不会浪费内存)

- refresh()

  刷新当前页面

- title【注意没有括号】  

  获取当前页面的标题(就是浏览器页面上方的窗口标题)

- page_source

  获取当前页面渲染之后的源代码

- current_url

  获取当前页面的url

- window_handles

  获取当前会话中所有窗口的句柄(句柄就是一个页面的标志,页面切换的参数)


查找元素

Webdriver对象中内置了查找节点元素的方法,使用非常方便。

单个查找

以下是查找单个元素的方法:

方法 作用
find_element_by_xpath() 通过Xpath查找
find_element_by_class_name() 通过class属性查找
find_element_by_css_selector() 通过css选择器查找
find_element_by_id() 通过id查找
find_element_by_link_text() 通过链接文本查找
find_element_by_name() 通过name属性进行查找
find_element_by_partial_link_text() 通过链接文本的部分匹配查找
find_element_by_tag_name() 通过标签名查找

查找后返回的是一个Webelement对象。

查找到了对象,就相当于浏览器的鼠标已经放在了对象上面,想要对其操作,

就需要用一个变量存放该对象,再进行需要的操作

多个查找

上面的方法都是将第一个找到的元素返回,而将所有匹配的元素进行返回使用的是

find_elements_by_* 方法。

注意:将其中的elelment加上一个s,就是对应的多个查找的方法。

此方法返回的是一个Webelement对象组成的列表。

通过私有方法进行查找

除了以上的多种查找方式,还有两种私有方法find_element()find_elements()可以使用:

例子:

需要导入新的方法:from selenium.webdriver.common.by import By
from selenium.webdriver.common.by import By

driver.find_element(By.XPATH, '//button[text()="Some text"]')
driver.find_elements(By.XPATH, '//button')

By这个类是专门用来查找元素时传入的参数,这个类中有以下属性:

ID = "id"
XPATH = "xpath"
LINK_TEXT = "link text"
PARTIAL_LINK_TEXT = "partial link text"
NAME = "name"
TAG_NAME = "tag name"
CLASS_NAME = "class name"
CSS_SELECTOR = "css selector"

使用了WebDriverWait以后仍然无法找到元素

有很多时候,一个简单的元素,明明也加了显式等待,但就是找不到,代码在仔细查看过后也没有问题后,多半是以下这几种情况:

  1. 由于分辨率设置的原因,查找的元素当前是不可见的。

  2. 某些页面的元素是需要向下滚动页面才会加载的。

  3. 由于某些其他元素的短暂遮挡,所以无法定位到。

1.分辨率原因

这时候应该设置好分辨率,使当前元素能够显示到页面中。

2.需要滚动页面

有些页面为了性能的考虑,页面下方不在当前屏幕中的元素是不会加载的,只有当页面向下滚动时才会继续加载。

而selenium本身不提供向下滚动的方法,所以我们需要去用JS去滚动页面:

driver.execute_script("window.scrollTo(0, document.body.scrollHeight)")

网上查到的一些滚动方式在Chrome上无效。但这一句是有效的。

滚动的位置:

网页可见区域宽: document.body.clientWidth;
网页可见区域高: document.body.clientHeight;
网页可见区域宽: document.body.offsetWidth   (包括边线的宽);
网页可见区域高: document.body.offsetHeight  (包括边线的宽);
网页正文全文宽: document.body.scrollWidth;
网页正文全文高: document.body.scrollHeight;
网页被卷去的高: document.body.scrollTop;
网页被卷去的左: document.body.scrollLeft;
网页正文部分上: window.screenTop;
网页正文部分左: window.screenLeft;
屏幕分辨率的高: window.screen.height;
屏幕分辨率的宽: window.screen.width;
屏幕可用工作区高度: window.screen.availHeight;
屏幕可用工作区宽度:window.screen.availWidth;

3.由于其他元素的遮挡

有时候因为一些弹出元素的原因,如果还使用EC.presence_of_element_located()的话,

我们需要定位的元素就无法被找到,这个时候我们就应该改变我们判断元素的方法:

element = WebDriverWait(driver, 10).until(
EC.visibility_of_element_located((By.XPATH, ''))
)

使用EC.visibility_of_element_located()方法可以在等待到当前元素可见后,才获取元素。

在我们找不到元素,或者跟元

素无法交互时,应该多去根据当前的情况,灵活选择显式等待的判断方式。


操作Cookie

  • add_cookie(cookie_dict)

    给当前会话添加一个cookie。

    • cookie_dict: 一个字典对象,必须要有"name"和"value"两个键,

    • 可选的键有:“path”, “domain”, “secure”, “expiry” 。

    • 用法:

      driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’})
      driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’})
      driver.add_cookie({‘name’ : ‘foo’, ‘value’ : ‘bar’, ‘path’ : ‘/’, ‘secure’:True})
  • get_cookie(name)

    按name获取单个Cookie,没有则返回None。

  • get_cookies()

    获取所有Cookie,返回的是一组字典。

  • delete_all_cookies()

    删除所有Cookies。

  • delete_cookie(name)

    按name删除指定cookie。


获取截屏

  • get_screenshot_as_base64()

    获取当前窗口的截图保存为一个base64编码的字符串。

  • get_screenshot_as_file(filename)

    获取当前窗口的截图保存为一个png格式的图片,filename参数为图片的保存地址,最后应该以.png结尾。如果出现IO错误,则返回False。

    用法:

    driver.get_screenshot_as_file(‘/Screenshots/foo.png’)
  • get_screenshot_as_png()

    获取当前窗口的截图保存为一个png格式的二进制字符串。


获取窗口信息

  • get_window_position(windowHandle='current')

    获取当前窗口的x,y坐标。(字典格式)

  • get_window_size(windowHandle='current')

     获取当前窗口的高度和宽度。(字典格式)

  • get_window_rect()

    获取当前窗口的高度和宽度和当前窗口的x,y坐标。(字典格式)

切换

在实际的爬虫中,有时候我们会遇到找不到元素的问题,明明定位的路径没问题,

这个时候我们可以考虑一下是否是该页面存在frame的问题导致的定位不到元素。

  • switch_to_frame(frame_reference)

    将焦点切换到指定的子框架中


用selenium操作浏览器如果需要在打开新的页面,这个时候会有问题,

因为我们用selenium操作的是第一个打开的窗口,所以新打开的页面我们是无法去操作的,

所以我们要用到切换窗口:既handle切换的方法

  • switch_to.window(window_name)

    切换窗口(参数就是句柄)


有的时候还会遇到弹窗的问题, 主要有两种一种是浏览器弹窗(alert/prompt),

一种是自定义弹窗

自定义弹窗,就是一个自定义的div层,是隐藏页面中的,当触发了这个弹窗后,他就显示出来,

这种方式我们通过正常的定位方式是可以定位到的。

alert弹窗,就要用下面的方法处理:


执行JS代码

execute_async_script(script, *args)

在当前的window/frame中异步执行JS代码。

script:是你要执行的JS代码。

*args:是你的JS代码执行要传入的参数。

selenium常用操作,查找元素,操作Cookie,获取截图,获取窗口信息,切换,执行js代码的更多相关文章

  1. selenium 执行js代码

    获取一个input输入框的值: JavascriptExecutor js =(JavascriptExecutor) driver; merchatName=js.executeScript(&qu ...

  2. Android获取cpu和内存信息、网址的代码

      android获取手机cpu并判断是单核还是多核 /** * Gets the number of cores available in this device, across all proce ...

  3. <自动化测试>之<selenium API 查找元素操作底层方法>

    搜罗了一些查找元素的除标准语句外,另外的语句使用方法,摘自 开源中国 郝云鹏driver = webdriver.Chrome(); 打开测试页面 driver.get( "http://b ...

  4. C++ 关联容器之map插入相同键元素与查找元素操作

    一.插入相同键元素操作 (1)insert方法 在map中的键必须是唯一的,当想map中连续插入键相同但值不同的元素时,编译和运行时都不会发生任何错误,系统会忽略后面的对已存在的键的插入操作,如 ma ...

  5. Selenium 常用定位对象元素的方法

    常见定位对象元素的方法 在使用selenium webdriver进行元素定位时,通常使用findElement或findElements方法结合By类返回的元素句柄来定位元素.其中By类的常用定位方 ...

  6. python实例编写(1)--浏览器操作,元素操作

    一.浏览器操作 1.  back()与 forward() #coding=gbk //编码不一定是utf-8 from selenium import webdriver //导入包,也叫”模组“ ...

  7. 利用ajax获取到的网页源码不能执行js代码

    今天觉得我的博客中加载腾讯微博的速度很慢,所以就想改写为js,本来以为直接新建一个页面,把获取函数移到新的页面中,原来的页面只要使用xmlhttp去GET一下,然后把div的innerhtml属性等于 ...

  8. Selenium webdriver Java 查找元素

    1.简单查找 By ID: WebElement element=driver.findElement(By.id("userId")); By Name:WebElement e ...

  9. Selenium常用API的使用java语言之10-获取断言信息

    不管是在做功能测试还是自动化测试,最后一步需要拿实际结果与预期进行比较.这个比较的称之为断言. 我们通常可以通过获取title .URL和text等信息进行断言.text方法在前面已经讲过,它用于获取 ...

随机推荐

  1. 为何Google这类巨头会认为敏捷开发原则是废话?

    [编者按]这是一个来自Quora的问题.Rocket程序员Jasmine Adamson在文中表达了敏捷开发原则是废话的观点,他觉得现实生活中没有什么人会推崇这些原则来工作,不过他们仍然在说其所做的是 ...

  2. 洛谷P2516 [HAOI2010]最长公共子序列

    题目描述 字符序列的子序列是指从给定字符序列中随意地(不一定连续)去掉若干个字符(可能一个也不去掉)后所形成的字符序列.令给定的字符序列X="x0,x1,-,xm-1",序列Y=& ...

  3. 用vue-cli快速构建项目

    用vue-cli脚手架快速构建项目的过程:1.首先要在node的环境下安装: 1>安装node:https://nodejs.org/en/(带npm,但是npm太慢了,建议安装cnpm,cnp ...

  4. Codeforces 766E

    题意:给一棵树(1e5),每个节点上有对应权值(0<=ai<=1e6)定义树上两个节点间的距离为路径中节点的异或,求所有节点对间的距离和(包括节点自身也作为节点对,距离为节点权值). 解题 ...

  5. 题解报告:hdu 1575 Tr A

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=1575 Problem Description A为一个方阵,则Tr A表示A的迹(就是主对角线上各项的 ...

  6. centos mysql允许远程root登录

    Mysql为了安全性,在默认情况下用户只允许在本地登录,可是在有此情况下,还是需要使用用户进行远程连接,因此为了使其可以远程需要进行如下操作: 一.允许root用户在任何地方进行远程登录,并具有所有库 ...

  7. 【Spring】AOP

    AOP 编程允许你把遍布应用各处的功能分离出来形成可重用的组件,将安全.事务和日志关注点与你的核心业务逻辑相分离. 面向切面编程往往被定义为促使应用程序分离关注点的一项技术.系统由许多不同组件组成,每 ...

  8. asp.net——统计输入的字符数目

    asp.net——统计输入的字符数目 题目: 在页面中有一个TextBox输入框,一个显示文字用的Label,一个提交按钮Button.在TextBox中输入一段英文字母,点击按钮提交后统计其中字母‘ ...

  9. JS——对象创建

    1.原始创建 <script> person = new Object();//不要var person.firstname = "Bill"; person.last ...

  10. CSS——样式初始化

    腾讯: body,ol,ul,h1,h2,h3,h4,h5,h6,p,th,td,dl,dd,form,fieldset,legend,input,textarea,select{margin:0;p ...