欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

python selenium

程序员文章站 2022-07-14 09:55:32
...

Selenium提供了8种方法定位方式-------->在Python selenium中所对应的方法

  • id --------------->find_element_by_id()
  • name --------------->find_element_by_name()
  • class name --------------->find_element_by_class_name()
  • tag name --------------->find_element_by_tag_name()
  • link text --------------->find_element_by_link_text()
  • partial link text --------------->find_element_by_partial_link_text()
  • xpath --------------->find_element_by_xpath()
  • css selector --------------->find_element_by_css_selector()

定位一组元素的方法与定位单个元素的方法类似,唯一的区别是在单词element后面多了一个s表示复数。

e.g:texts = driver.find_elements_by_xpath('//div/h3/a') # 定位一组元素

          # 循环遍历出每一条搜索结果的标题      

             for t in texts:

                   print(t.text)   

常用方法:

      不同窗口之间的切换  switch_to.window()

        driver.get_screenshot_as_file(“截图保存路径”)来截取当前窗口

  • close() 关闭单个窗口

  • quit() 关闭所有窗口

  • text:返回 alert/confirm/prompt 中的文字信息。

  • accept():接受现有警告框。

  • dismiss():解散现有警告框。

  • send_keys(keysToSend):发送文本至警告框。keysToSend:将文本发送至警告框。

switch_to_alert()方法获取当前页面上的警告框,并使用accept()方法接受警告框

select_by_value() 方法用于定位下接选项中的value值

  • current_window_handle:获得当前窗口句柄。
  • window_handles:返回所有窗口的句柄到当前会话。
  • switch_to.window():用于切换到相应的窗口,与上一节的switch_to.frame()类似,前者用于不同窗口的切换,后者用于不同表单之间的切换。
  • clear(): 清除文本。--------> driver.find_element_by_id("kw").clear()

  • send_keys (value): 模拟按键输入。--------> driver.find_element_by_id("kw").send_keys("selenium")

  • click(): 单击元素。--------> driver.find_element_by_id("su").click()

  • submit() -------->search_text.submit()   

有时候 submit()可以与 click()方法互换来使用, submit()同样可以提交一个按钮, 但 submit()的应用范围远不及 click()广泛

  • size: 返回元素的尺寸。size = driver.find_element_by_id('kw').size   print(size)

  • text: 获取元素的文本。 text = driver.find_element_by_id("cp").text    print(text)

  • get_attribute(name): 获得属性值。 attribute = driver.find_element_by_id("kw").get_attribute('type')        print(attribute)

  • is_displayed(): 设置该元素是否用户可见。result = driver.find_element_by_id("kw").is_displayed()         print(result) 

size 方法用于获取百度输入框的宽、 高, text 方法用于获得百度底部的备案信息, get_attribute()用于获得百度输入的 type 属性的值, is_displayed()用于返回一个元素是否可见, 如果可见则返回 True, 否则返回 False。

driver.refresh() #刷新当前页面

WebDriver提供了set_window_size()方法来设置浏览器的大小  

在PC端执行自动化测试脚本大多的情况下是希望浏览器在全屏幕模式下执行,那么可以使用maximize_window()方法使打开的浏览器全屏显示,其用法与set_window_size() 相同,但它不需要参数

WebDriver也提供了对应的back()和forward()方法来模拟后退和前进按钮

WebDriver中关于鼠标操作的方法封装在 ActionChains 类

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

  • perform(): 执行所有 ActionChains 中存储的行为;

  • context_click(): 右击;

  • double_click(): 双击;

  • drag_and_drop(): 拖动;

  • move_to_element(): 鼠标悬停   above = driver.find_element_by_link_text("设置") # 定位到要悬停的元素    

ActionChains(driver).move_to_element(above).perform() # 对定位到的元素执行鼠标悬停操作

from selenium.webdriver import ActionChains

导入提供鼠标操作的 ActionChains 类。

ActionChains(driver)

调用 ActionChains()类, 将浏览器驱动 driver 作为参数传入。

move_to_element(above)

context_click()方法用于模拟鼠标右键操作, 在调用时需要指定元素定位。

perform()

执行所有 ActionChains 中存储的行为, 可以理解成是对整个操作的提交动作。

在使用键盘按键方法前需要先导入 keys 类。

  • from selenium.webdriver.common.keys import Keys

常用的键盘操作:

  • send_keys(Keys.BACK_SPACE) 删除键(BackSpace)

  • send_keys(Keys.SPACE) 空格键(Space)

  • send_keys(Keys.TAB) 制表键(Tab)

  • send_keys(Keys.ESCAPE) 回退键(Esc)

  • send_keys(Keys.ENTER) 回车键(Enter)

  • send_keys(Keys.CONTROL,‘a’) 全选(Ctrl+A)

  • send_keys(Keys.CONTROL,‘c’) 复制(Ctrl+C)

  • send_keys(Keys.CONTROL,‘x’) 剪切(Ctrl+X)

  • send_keys(Keys.CONTROL,‘v’) 粘贴(Ctrl+V)

  • send_keys(Keys.F1) 键盘 F1

  • ……

  • send_keys(Keys.F12) 键盘 F12

  • title:用于获得当前页面的标题。   ------>  title = driver.title
  • current_url:用户获得当前页面的URL。  -----> now_url = driver.current_url
  • text:获取搜索条目的文本信息。 ---------->  user = driver.find_element_by_class_name('nums').text

WebDriver提供了两种类型的等待:显式等待隐式等待

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

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

WebDriverWait(driver, timeout, poll_frequency=0.5, ignored_exceptions=None)
  • driver :浏览器驱动。
  • timeout :最长超时时间,默认以秒为单位。
  • poll_frequency :检测的间隔(步长)时间,默认为0.5S。
  • ignored_exceptions :超时后的异常信息,默认情况下抛NoSuchElementException异常。

WebDriverWait()一般由until()或until_not()方法配合使用,下面是until()和until_not()方法的说明。 * until(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为True。 * until_not(method, message=‘’) 调用该方法提供的驱动程序作为一个参数,直到返回值为False。

通过as关键字将expected_conditions 重命名为EC,并调用presence_of_element_located()方法判断元素是否存在

隐式等待

WebDriver提供了implicitly_wait()方法来实现隐式等待,默认设置为0。

from selenium import webdriver
from selenium.common.exceptions import NoSuchElementException
from time import ctime

driver = webdriver.Firefox()

# 设置隐式等待为10秒
driver.implicitly_wait(10)
driver.get("http://www.baidu.com")

try:
    print(ctime())
    driver.find_element_by_id("kw22").send_keys('selenium')
except NoSuchElementException as e:
    print(e)
finally:
    print(ctime())
    driver.quit()

implicitly_wait()默认参数的单位为秒,本例中设置等待时长为10秒。首先这10秒并非一个固定的等待时间,它并不影响脚本的执行速度。其次,它并不针对页面上的某一元素进行等待。当脚本执行到某个元素定位时,如果元素可以定位,则继续执行;如果元素定位不到,则它将以轮询的方式不断地判断元素是否被定位到。假设在第6秒定位到了元素则继续执行,若直到超出设置时长(10秒)还没有定位到元素,则抛出异常。

在Web应用中经常会遇到frame/iframe表单嵌套页面的应用,WebDriver只能在一个页面上对元素识别与定位,对于frame/iframe表单内嵌页面上的元素无法直接定位就需要通过switch_to.frame()方法将当前定位的主体切换为frame/iframe表单的内嵌页面中

driver.switch_to.default_content()

switch_to.frame() 默认可以直接取表单的id 或name属性。如果iframe没有可用的id和name属性,则可以通过下面的方式进行定位。

……
#先通过xpth定位到iframe
xf = driver.find_element_by_xpath('//*[@id="x-URS-iframe"]')

#再将定位对象传给switch_to.frame()方法
driver.switch_to.frame(xf)
……
driver.switch_to.parent_frame()

在进入多级表单的情况下,还可以通过switch_to.default_content()跳回最外层的页面

WebDriver操作cookie的方法:

  • get_cookies(): 获得所有cookie信息。

  • get_cookie(name): 返回字典的key为“name”的cookie信息。

  • add_cookie(cookie_dict) : 添加cookie。“cookie_dict”指字典对象,必须有name 和value 值。

  • delete_cookie(name,optionsString):删除cookie信息。“name”是要删除的cookie的名称,“optionsString”是该cookie的选项,目前支持的选项包括“路径”,“域”。

  • delete_all_cookies(): 删除所有cookie信息