赞
踩
目录
- 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提供了下列的方法给你:
一次查找多个元素 (这些方法会返回一个list列表):
除了上述的公共方法,下面还有两个私有方法,在你查找也页面元素的时候也许有用。 他们是 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()
可以实现弹出对话框、下拉页面等操作。
下拉页面:
js来拖动滚动条
js_="window.scrollTo(100,600);"
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 获取节点在页面相对位置 获取标签名称 获取节点宽高
网页中有一种节点叫做iframe,也就是子frame,相当于页面的子页面,我们默认是在父级frame里面操作,若想在子frame里面操作,就要用:
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() 方法说明:
模块包含一套预定义的条件集合。大大方便了 WebDriverWait 的使用。
Expected Conditions 类提供的预期条件判断方法
在进行浏览器自动化的时候,有一些条件是经常出现的,下面列出的是每个条件的实现。Selenium Python binding provides some convienence 提供了很多实用的方法,因此,你无须再去编写 expected_condition class 或是创建你自己的工具包来实现这个工作。
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()
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()
https://selenium-python.readthedocs.io/api.html
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。