当前位置:   article > 正文

Selenium知识点_selenium page_source

selenium page_source

目录

一:基本操作

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

三:输入、清空、点击

四:拖放

五:用selenium执行JS代码

六:获取节点信息

七:选择Frame

八:延时等待

九:前进和后退

十:cookies

十一:选项卡管理

十二:其他的API


 

一:基本操作

  1. from selenium import webdriver
  2. browser=webdriver.Chrome()#完成浏览器对象的初始化
  3. browser.get('http://www.imomoe.in/')#使用get进入一个页面
  4. print(browser.page_source)#page_source属性打印网页源代码,包含JS
  5. browser.close()#关闭浏览器窗口,不要用quit(),quit()是关掉这个浏览器实例

附:无界面浏览器模式:

  1. from selenium.webdriver.chrome.options import Options
  2. from selenium import webdriver
  3. #下面加在setup最上面
  4. chrome_options =Options()
  5. chrome_options.add_argument('--headless')
  6. driver = webdriver.Chrome(options=chrome_options)
  7. driver.get('https://www.baidu.com')
  8. print(driver.page_source)
  9. 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 。

用法示例:

  1. from selenium.webdriver.common.by import By
  2. driver.find_element(By.XPATH, '//button[text()="Some text"]')
  3. driver.find_elements(By.XPATH, '//button')

下面是 By 类的一些可用属性:

  1. ID = "id"
  2. XPATH = "xpath"
  3. LINK_TEXT = "link text"
  4. PARTIAL_LINK_TEXT = "partial link text"
  5. NAME = "name"
  6. TAG_NAME = "tag name"
  7. CLASS_NAME = "class name"
  8. CSS_SELECTOR = "css selector"

 

三:输入、清空、点击

  1. from selenium import webdriver
  2. import time
  3. browser=webdriver.Chrome()#完成浏览器对象的初始化
  4. browser.get('https://cn.bing.com/')#使用get进入一个页面
  5. browser.find_element_by_id('sb_form_q').send_keys('我爱你世界')#使用send_keys来输入
  6. time.sleep(2)
  7. browser.find_element_by_id('sb_form_q').clear()#使用clear来清空
  8. browser.find_element_by_id('sb_form_q').send_keys('python')
  9. time.sleep(2)
  10. browser.find_element_by_id('sb_form_go').click()#使用click来点击
  11. browser.close()

注:

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

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

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

  1. from selenium import webdriver
  2. from selenium.webdriver.common.keys import Keys
  3. import time
  4. driver = webdriver.Chrome()
  5. driver.get("http://www.baidu.com")
  6. time.sleep(3)
  7. driver.find_element_by_id('kw').send_keys('selenium') #在搜索框中输入"selenium"
  8. driver.find_element_by_id('kw').send_keys(Keys.SPACE) #输入空格键
  9. driver.find_element_by_id('kw').send_keys('python') #在搜索框中输入"python"
  10. driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'a') #输入Control+a模拟全选
  11. driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'c') #输入Control+c模拟复制
  12. driver.find_element_by_id('kw').send_keys(Keys.CONTROL, 'v') #输入Control+v模拟粘贴
  13. driver.find_element_by_id('kw').send_keys(Keys.ENTER) #输入回车代替点击搜索按钮
  14. time.sleep(3)
  15. driver.close()
  16. #下面是一些常用的键盘事件:
  17. # Keys.BACK_SPACE:回退键(BackSpace)
  18. # Keys.TAB:制表键(Tab)
  19. # Keys.ENTER:回车键(Enter)
  20. # Keys.SHIFT:大小写转换键(Shift)
  21. # Keys.CONTROL:Control键(Ctrl)
  22. # Keys.ALT:ALT键(Alt)
  23. # Keys.ESCAPE:返回键(Esc)
  24. # Keys.SPACE:空格键(Space)
  25. # Keys.PAGE_UP:翻页键上(Page Up)
  26. # Keys.PAGE_DOWN:翻页键下(Page Down)
  27. # Keys.END:行尾键(End)
  28. # Keys.HOME:行首键(Home)
  29. # Keys.LEFT:方向键左(Left)
  30. # Keys.UP:方向键上(Up)
  31. # Keys.RIGHT:方向键右(Right)
  32. # Keys.DOWN:方向键下(Down)
  33. # Keys.INSERT:插入键(Insert)
  34. # DELETE:删除键(Delete)
  35. # NUMPAD0 ~ NUMPAD9:数字键1-9
  36. # F1 ~ F12:F1 - F12键
  37. # (Keys.CONTROL, ‘a’):组合键Control+a,全选
  38. # (Keys.CONTROL, ‘c’):组合键Control+c,复制
  39. # (Keys.CONTROL, ‘x’):组合键Control+x,剪切
  40. # (Keys.CONTROL, ‘v’):组合键Control+v,粘贴

 

四:拖放

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

  1. element = driver.find_element_by_name("source")
  2. target = driver.find_element_by_name("target")
  3. from selenium.webdriver import ActionChains
  4. action_chains = ActionChains(driver)
  5. action_chains.drag_and_drop(element, target).perform()

实例:

  1. from selenium import webdriver
  2. from selenium.webdriver import ActionChains
  3. browser=webdriver.Chrome()
  4. browser.get('https://www.runoob.com/try/try.php?filename=jqueryui-api-droppable')
  5. browser.switch_to_frame('iframeResult')#选择到到页面的一个框架上
  6. source=browser.find_element_by_css_selector('#draggable')#选择被拖曳的
  7. target=browser.find_element_by_css_selector('#droppable')#选择目的地
  8. actions=ActionChains(browser)#生成动作链对象
  9. actions.drag_and_drop(source,target)#说明动作
  10. actions.perform()#执行动作
  11. browser.close()

 

五:用selenium执行JS代码

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

下拉页面:

js来拖动滚动条

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

  2. driver.execute_script(js_)

实例:

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get('https://selenium-python.readthedocs.io/navigating.html')
  5. js_code1='window.scrollTo(0,200)'#下拉一定距离
  6. js_code2='window.scrollTo(200,300)'
  7. js_code3='window.scrollTo(300,400)'
  8. js_code4='window.scrollTo(400,500)'
  9. js_code5='window.scrollTo(400,document.body.scrollHeight)'#下拉到末尾
  10. browser.execute_script(js_code1)#执行代码
  11. time.sleep(2)
  12. browser.execute_script(js_code2)
  13. time.sleep(2)
  14. browser.execute_script(js_code3)
  15. time.sleep(2)
  16. browser.execute_script(js_code4)
  17. time.sleep(2)
  18. browser.execute_script(js_code5)
  19. time.sleep(2)
  20. browser.close()

 

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

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

 

六:获取节点信息

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

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

实例:

  1. from selenium import webdriver
  2. import time
  3. browser = webdriver.Chrome()
  4. browser.get('https://search.bilibili.com/all?keyword=%E5%8D%A2%E6%9C%AC%E4%BC%9F&from_source=nav_suggest_new')
  5. ret1=browser.find_element_by_css_selector('#server-search-app > div > div.head-contain > div.search-wrap > div > div > a')
  6. print(ret1)
  7. print(ret1.get_attribute('class'))#获取class
  8. print(ret1.get_attribute('href'))#获取href
  9. 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 组合使用,就是一种有效的解决手段。

  1. from selenium import webdriver
  2. from selenium.webdriver.common.by import By
  3. from selenium.webdriver.support.ui import WebDriverWait
  4. from selenium.webdriver.support import expected_conditions as EC
  5. driver = webdriver.Firefox()driver.get("http://somedomain/url_that_delays_loading")
  6. try:
  7. element = WebDriverWait(driver, 10).until(
  8. EC.presence_of_element_located((By.ID, "myDynamicElement")))
  9. finally:
  10. driver.quit()

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

 

  1. from selenium.webdriver.support import expected_conditions as EC
  2. wait_result = WebDriverWait(driver=self.driver, timeout=300, poll_frequency=0.5, ignored_exceptions=None).until(
  3. 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对象实例的整个生命周期。

  1. from selenium import webdriver
  2. driver = webdriver.Firefox()
  3. driver.implicitly_wait(10) # seconds
  4. driver.get("http://somedomain/url_that_delays_loading")
  5. myDynamicElement = driver.find_element_by_id("myDynamicElement")

 

九:前进和后退

  1. from selenium import webdriver
  2. import time
  3. browser=webdriver.Chrome()
  4. browser.get('https://i.csdn.net/#/uc/profile')
  5. browser.get('https://www.jd.com/')
  6. browser.get('https://www.taobao.com/')
  7. browser.back()#后退
  8. time.sleep(1)
  9. browser.forward()#前进
  10. time.sleep(1)
  11. browser.back()
  12. time.sleep(1)
  13. browser.back()
  14. time.sleep(1)
  15. browser.close()

 

十:cookies

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

十一:选项卡管理

switch_to_window已弃用,应使用switch_to.window

  1. import time
  2. from selenium import webdriver
  3. browser=webdriver.Chrome()
  4. browser.get('http://www.baidu.com')
  5. browser.execute_script('window.open()')#用js代码实现打开一个新窗口
  6. time.sleep(2)
  7. browser.switch_to.window(browser.window_handles[1])#跟据选项卡的代号切换
  8. browser.get('http://www.baidu.com')
  9. time.sleep(2)
  10. browser.switch_to.window(browser.window_handles[0])
  11. time.sleep(2)
  12. browser.quit()

 

十二:其他的API

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

 

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/weixin_40725706/article/detail/111652
推荐阅读
相关标签
  

闽ICP备14008679号