Selenium知识点

目录

一:基本操作

二:查找节点(定位网页的某一个位置)

三:输入、清空、点击

四:拖放

五:用selenium执行JS代码

六:获取节点信息

七:选择Frame

八:延时等待

九:前进和后退

十:cookies

十一:选项卡管理

十二:其他的API


 

一:基本操作

from selenium import webdriver

browser=webdriver.Chrome()#完成浏览器对象的初始化

browser.get('http://www.imomoe.in/')#使用get进入一个页面

print(browser.page_source)#page_source属性打印网页源代码,包含JS

browser.close()#关闭浏览器窗口,不要用quit(),quit()是关掉这个浏览器实例

附:无界面浏览器模式:

from selenium.webdriver.chrome.options import Options
from selenium import webdriver
		
#下面加在setup最上面
chrome_options =Options()
chrome_options.add_argument('--headless')
driver = webdriver.Chrome(options=chrome_options)
driver.get('https://www.baidu.com')
print(driver.page_source)
driver.close()

 

二:查找节点(定位网页的某一个位置)

在一个页面中有很多不同的策略可以定位一个元素。在你的项目中, 你可以选择最合适的方法去查找元素。Selenium提供了下列的方法给你:

  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_partial_link_text
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector

一次查找多个元素 (这些方法会返回一个list列表):

  • find_elements_by_name
  • find_elements_by_xpath
  • find_elements_by_link_text
  • find_elements_by_partial_link_text
  • find_elements_by_tag_name
  • find_elements_by_class_name
  • find_elements_by_css_selector

除了上述的公共方法,下面还有两个私有方法,在你查找也页面元素的时候也许有用。 他们是 find_element 和 find_elements 。

用法示例:

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"

 

三:输入、清空、点击

from selenium import webdriver
import time

browser=webdriver.Chrome()#完成浏览器对象的初始化

browser.get('https://cn.bing.com/')#使用get进入一个页面

browser.find_element_by_id('sb_form_q').send_keys('我爱你世界')#使用send_keys来输入
time.sleep(2)
browser.find_element_by_id('sb_form_q').clear()#使用clear来清空

browser.find_element_by_id('sb_form_q').send_keys('python')
time.sleep(2)
browser.find_element_by_id('sb_form_go').click()#使用click来点击

browser.close()

注:

您可以使用“ Keys”类来模拟按箭头键:

element.send_keys(" and some", Keys.ARROW_DOWN)#用Keys.ENTER可以实现回车提交表单

要先引入:from selenium.webdriver.common.keys import Keys 

from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
 
driver = webdriver.Chrome()
driver.get("http://www.baidu.com")
time.sleep(3)
 
driver.find_element_by_id('kw').send_keys('selenium') #在搜索框中输入"selenium" 
driver.find_element_by_id('kw').send_keys(Keys.SPACE) #输入空格键
driver.find_element_by_id('kw').send_keys('python') #在搜索框中输入"python"
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a') #输入Control+a模拟全选
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c') #输入Control+c模拟复制
driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v') #输入Control+v模拟粘贴
driver.find_element_by_id('kw').send_keys(Keys.ENTER) #输入回车代替点击搜索按钮
 
time.sleep(3)
driver.close()
 
#下面是一些常用的键盘事件:
 # Keys.BACK_SPACE:回退键(BackSpace)
 # Keys.TAB:制表键(Tab)
 # Keys.ENTER:回车键(Enter)
 # Keys.SHIFT:大小写转换键(Shift)
 # Keys.CONTROL:Control键(Ctrl) 
 # Keys.ALT:ALT键(Alt) 
 # Keys.ESCAPE:返回键(Esc) 
 # Keys.SPACE:空格键(Space) 
 # Keys.PAGE_UP:翻页键上(Page Up) 
 # Keys.PAGE_DOWN:翻页键下(Page Down) 
 # Keys.END:行尾键(End) 
 # Keys.HOME:行首键(Home) 
 # Keys.LEFT:方向键左(Left) 
 # Keys.UP:方向键上(Up)
 # Keys.RIGHT:方向键右(Right)
 # Keys.DOWN:方向键下(Down) 
 # Keys.INSERT:插入键(Insert)
 # DELETE:删除键(Delete)
 # NUMPAD0 ~ NUMPAD9:数字键1-9 
 # F1 ~ F12:F1 - F12键
 # (Keys.CONTROL, ‘a’):组合键Control+a,全选 
 # (Keys.CONTROL, ‘c’):组合键Control+c,复制
 # (Keys.CONTROL, ‘x’):组合键Control+x,剪切 
 # (Keys.CONTROL, ‘v’):组合键Control+v,粘贴

 

四:拖放

您可以使用拖放操作,将一个元素移动一定量,或移动到另一个元素上:


element = driver.find_element_by_name("source")
target = driver.find_element_by_name("target")

from selenium.webdriver import ActionChains
action_chains = ActionChains(driver)
action_chains.drag_and_drop(element, target).perform()

实例:

from selenium import webdriver
from selenium.webdriver import ActionChains

browser=webdriver.Chrome()
browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')

browser.switch_to_frame('iframeResult')#选择到到页面的一个框架上
source=browser.find_element_by_css_selector('#draggable')#选择被拖曳的
target=browser.find_element_by_css_selector('#droppable')#选择目的地

actions=ActionChains(browser)#生成动作链对象
actions.drag_and_drop(source,target)#说明动作
actions.perform()#执行动作

browser.close()

 

五:用selenium执行JS代码

可以实现弹出对话框、下拉页面等操作。

下拉页面:

js来拖动滚动条

  1. js_="window.scrollTo(100,600);"

  2. driver.execute_script(js_)

实例:

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('https://selenium-python.readthedocs.io/navigating.html')

js_code1='window.scrollTo(0,200)'#下拉一定距离
js_code2='window.scrollTo(200,300)'
js_code3='window.scrollTo(300,400)'
js_code4='window.scrollTo(400,500)'
js_code5='window.scrollTo(400,document.body.scrollHeight)'#下拉到末尾

browser.execute_script(js_code1)#执行代码
time.sleep(2)
browser.execute_script(js_code2)
time.sleep(2)
browser.execute_script(js_code3)
time.sleep(2)
browser.execute_script(js_code4)
time.sleep(2)
browser.execute_script(js_code5)
time.sleep(2)

browser.close()

 

  • execute_script()是同步方法,用它执行js代码会阻塞主线程执行,直到js代码执行完毕;

  • execute_async_script()方法是异步方法,它不会阻塞主线程执行。

 

六:获取节点信息

webelement的page_source属性可以获取网页的源代码,包含JS。

webelement.get_attribute(attribute)可以获取对应属性。

实例:

from selenium import webdriver
import time

browser = webdriver.Chrome()
browser.get('https://search.bilibili.com/all?keyword=%E5%8D%A2%E6%9C%AC%E4%BC%9F&from_source=nav_suggest_new')
ret1=browser.find_element_by_css_selector('#server-search-app > div > div.head-contain > div.search-wrap > div > div > a')
print(ret1)
print(ret1.get_attribute('class'))#获取class
print(ret1.get_attribute('href'))#获取href

browser.close()

webelement.text可以获取标签内的文本信息。

print(ret1.text)

(相当于BeautifulSoup的get_text()方法)

 

webelement.id     webelement.location    webelement.tag_name    web.element.size 

获取节点id            获取节点在页面相对位置    获取标签名称                 获取节点宽高

 

七:选择Frame

网页中有一种节点叫做iframe,也就是子frame,相当于页面的子页面,我们默认是在父级frame里面操作,若想在子frame里面操作,就要用:

  1. driver.switch_to_.frame(reference)
    方法来切换frame。reference是传入的参数,用来定位frame,可以传入id、name、index以及selenium的WebElement对象。

    通常采用id和name就能够解决绝大多数问题。但有时候frame并无这两项属性,则可以用index和WebElement来定位:

    index从0开始,传入整型参数即判定为用index定位,传入str参数则判定为用id/name定位
    WebElement对象,即用find_element系列方法所取得的对象,我们可以用tag_name、xpath等来定位frame对象。

     2.

driver.switch_to.default_content()

切到frame中之后,我们便不能继续操作主文档的元素,这时如果想操作主文档内容,则需切回主文档。

     3.

driver.switch_to.parent_frame()  # 如果当前已是主文档,则无效果

有时候我们会遇到嵌套的frame,从frame2再切回frame1,这里selenium给我们提供了一个方法能够从子frame切回到父frame,而不用我们切回主文档再切进来。有了parent_frame()这个相当于后退的方法,我们可以随意切换不同的frame,随意的跳来跳去了。

    

八:延时等待

现在越来越多的 web app 使用 AJAX 技术。当一个页面加载到浏览器后,这个页面的很多元素加载的时间可能不一致。这就使得元素定位比较尴尬了,如果某个要定位的元素还没有加载出来,在定位的时候,就会抛出异常: ElementNotVisibleException。这个时候,合理使用 wait ,我们就能很好的缓解这个尴尬。Selenium Webdriver 提供了两种类型的等待方法:隐式等待(implicit) 和 显示等待(explicit)。 显示等待情况下,只有特定条件触发后,WebDriver 才会继续执行后续操作。隐式等待情况下,WebDriver 等待一定时间,该时间段内,如果特定元素没加载成功,则抛出异常。

1. Explicit Waits(显示等待)

显示等待的代码定义了等待条件,只有该条件触发,才执行后续代码。最垃圾的显示等待就是使用 time.sleep(),这种情况是指定了固定的等待时长。 存在一些特别方便的方法,可以使你的代码只等待需要的时常,而不是固定的时常。WebDriverWait 和 ExpectedCondition 组合使用,就是一种有效的解决手段。

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

driver = webdriver.Firefox()driver.get("http://somedomain/url_that_delays_loading")
try:    
    element = WebDriverWait(driver, 10).until(           
        EC.presence_of_element_located((By.ID, "myDynamicElement")))
finally:    
    driver.quit()

上面的代码最多等待 10 秒,超时后就抛出 TimeoutException,假设在第3秒就找到了这个元素,那么也就不会多等剩下的7秒使时间,而是继续执行后续代码。WebDriverWait 默认每 500 毫秒调用一次 ExpectedCondition 中的方法,直到它返回成功信号,如果成功,则返回相应的内容,否则返回布尔类型的 False。

 

from selenium.webdriver.support import expected_conditions as EC

wait_result = WebDriverWait(driver=self.driver, timeout=300, poll_frequency=0.5,  ignored_exceptions=None).until(
    EC.text_to_be_present_in_element((By.XPATH, '//*[@id="VolumeTable"]/tbody/tr[1]/td[4]/label'), u'可用'))

driver:浏览器驱动
timeout:最长超时等待时间
poll_frequency:检测的时间间隔,默认为500ms
ignore_exception:超时后抛出的异常信息,默认情况下抛 NoSuchElementException 异常

配合使用的 until() 或者 until_not() 方法说明:

  • until(method, message='')
    调用该方法体提供的回调函数作为一个参数,直到返回值为True
  • until_not(method, message='')
    调用该方法体提供的回调函数作为一个参数,直到返回值为False

 

模块包含一套预定义的条件集合。大大方便了 WebDriverWait 的使用。

 

Expected Conditions 类提供的预期条件判断方法

 

在进行浏览器自动化的时候,有一些条件是经常出现的,下面列出的是每个条件的实现。Selenium Python binding provides some convienence 提供了很多实用的方法,因此,你无须再去编写 expected_condition class 或是创建你自己的工具包来实现这个工作。

  • title_is:判断当前页面的title是否等于预期
  • title_contains:判断当前页面的title是否包含预期字符串
  • presence_of_element_located:判断某个元素是否被加到了dom树里,并不代表该元素一定可见
  • visibility_of_element_located:判断某个元素是否可见. 可见代表元素非隐藏,并且元素的宽和高都不等于0
  • visibility_of:跟上面的方法做一样的事情,只是上面的方法要传入locator,这个方法直接传定位到的element就好了
  • presence_of_all_elements_located:判断是否至少有1个元素存在于dom树中。举个例子,如果页面上有n个元素的class都是'column-md-3',那么只要有1个元素存在,这个方法就返回True
  • text_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进去,否则返回False
  • invisibility_of_element_located:判断某个元素中是否不存在于dom树或不可见
  • element_to_be_clickable - it is Displayed and Enabled:判断某个元素中是否可见并且是enable的,这样的话才叫clickable
  • staleness_of:等某个元素从dom树中移除,注意,这个方法也是返回True或False
  • element_to_be_selected:判断某个元素是否被选中了,一般用在下拉列表
  • element_located_to_be_selected
  • element_selection_state_to_be:判断某个元素的选中状态是否符合预期
  • element_located_selection_state_to_be:跟上面的方法作用一样,只是上面的方法传入定位到的element,而这个方法传入locator
  • alert_is_present:判断页面上是否存在alert

2. Implicit Waits(隐式等待)

隐式等待是在尝试发现某个元素的时候,如果没能立刻发现,就等待固定长度的时间。默认设置是0秒。一旦设置了隐式等待时间,它的作用范围就是Webdriver对象实例的整个生命周期。

from selenium import webdriver

driver = webdriver.Firefox()
driver.implicitly_wait(10) # seconds
driver.get("http://somedomain/url_that_delays_loading")
myDynamicElement = driver.find_element_by_id("myDynamicElement")

 

九:前进和后退

from selenium import webdriver
import time

browser=webdriver.Chrome()
browser.get('https://i.csdn.net/#/uc/profile')
browser.get('https://www.jd.com/')
browser.get('https://www.taobao.com/')

browser.back()#后退
time.sleep(1)
browser.forward()#前进
time.sleep(1)
browser.back()
time.sleep(1)
browser.back()
time.sleep(1)

browser.close()

 

十:cookies

https://www.cnblogs.com/CYHISTW/p/11685846.html

十一:选项卡管理

switch_to_window已弃用,应使用switch_to.window

import time
from selenium import webdriver
browser=webdriver.Chrome()
browser.get('http://www.baidu.com')
browser.execute_script('window.open()')#用js代码实现打开一个新窗口
time.sleep(2)

browser.switch_to.window(browser.window_handles[1])#跟据选项卡的代号切换
browser.get('http://www.baidu.com')
time.sleep(2)

browser.switch_to.window(browser.window_handles[0])
time.sleep(2)

browser.quit()

 

十二:其他的API

https://selenium-python.readthedocs.io/api.html

 

1. Selenium是什么? Selenium是一个自动化测试工具,用于测试Web应用程序的功能和性能。 2. Selenium的组件有哪些? Selenium组件包括Selenium IDE、Selenium WebDriver、Selenium Grid。 3. Selenium IDE是什么? Selenium IDE是一款浏览器插件,可以录制和回放用户在浏览器中的操作。 4. Selenium WebDriver是什么? Selenium WebDriver是一个用于自动化测试的工具,可以通过编写代码来模拟用户在浏览器中的操作。 5. 如何在Java中使用Selenium WebDriver? 在Java中使用Selenium WebDriver需要先下载Selenium的Java库,并在代码中引用该库。然后可以使用WebDriver来创建一个浏览器实例,然后使用该实例来执行测试。 6. Selenium Grid是什么? Selenium Grid是一种用于分布式测试的工具,可以将测试任务分配给多台计算机来并行执行测试。 7. Selenium支持哪些浏览器? Selenium支持Chrome、Firefox、Internet Explorer、Safari等主流浏览器。 8. Selenium如何定位元素? Selenium可以通过元素的ID、名称、类名、标签名、链接文本、CSS选择器和XPath等方式来定位元素。 9. 如何使用Selenium进行数据驱动测试? 可以使用Selenium的TestNG插件来进行数据驱动测试。在TestNG中,可以使用@DataProvider注解来提供测试数据,然后在测试方法中使用该数据来执行测试。 10. 如何使用Selenium进行并发测试? 可以使用Selenium Grid来进行并发测试。在Grid中,可以将测试任务分配给多台计算机来并行执行测试。
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值