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

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.需要滚动页面

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

而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_screenshot_as_file(filename)

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

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

get_screenshot_as_png()

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

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

一种是自定义弹窗

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

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

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