selenium 的使用--持续更

selenium

'''Python from selenium import webdriver from selenium.webdriver.common.by import By from selenium.webdriver.common.keys import Key from selenium.webdriver.support import expected_condition as EC from selenium.webdriver.support.wait import WebdriverWait

brower= webdriver.Chrome()
try:
brower.get('https://www.baidu.com')
inp=brower.find_element_by_id('kw')
inp.send_keys('python')
inp.send_keys(Keys.ENTER)
waits=WebdriverWait(brower,10) #等待10s去做某些事情
waits.util(EC.presence_of_element_located((By.ID,'content_left'))) #显示等待
print(brower.current_url) #打印的是整个ulr
print(brower.get_cookies()) #打印cookies
print(brower.page_source) #打印渲染的网页
finally:
brower.close()
'''

selenium支持很多的浏览器 from selenium import webdriver brower=webdriver.Chrome() brower=webdriver.Firefox() brower=webdriver.Edge() brower=webdriver.PhantomJS() brower=webdriver.Safari()

二、访问页面

可以用get方法请求页面,参数传入URL即可,接下来就是调用browser对象,让其执行各个动作模拟浏览器操作

三、查找节点

'''python from selenium import webdriver

browser = webdriver.Chrome()
browser.get('https://www.taobao.com')
inp_first = browser.find_element_by_id('q')
inp_se = browser.find_element_by_css_selector('#q')
inp_third = browser.find_element_by_xpath('//*[@id="q"]')
print(inp_first, inp_se, inp_third)
browser.close()
'''
查找节点的几种方法:

  • find_element_by_id
  • find_element_by_name
  • find_element_by_xpath
  • find_element_by_link_text
  • find_element_by_tag_name
  • find_element_by_class_name
  • find_element_by_css_selector
  • 另外,selenium还提供了一种通用的方法find_element(),需要传递两个参数查找方式By和值。
    '''PyThon
    from selenium import webdriver
    from selenium.webdriver.common.by import By

    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    inp = browser.find_element(By.ID, 'q')
    print(inp)
    browser.close()
    '''


    上面的方法只能查找一个节点,如果要查找多个节点可以用find_elements() '''Python from selenium import webdriver from selenium.webdriver.common.by import By

    browser = webdriver.Chrome()
    browser.get('https://www.taobao.com')
    inp = browser.find_elements(By.CSS_SELECTOR, '.service-bd li')
    print(inp)
    browser.close()
    '''

    节点交互

    selenium可以驱动浏览器来执行一些操作,也就是说可以让浏览器模拟执行一些动作。常用的方法有:输入文字send_keys(),清空文字clear(),点击按钮时click()方法。 '''Python from selenium import webdriver from selenium.webdriver.common.by import By import time

    browser=webdriver.Chrome()
    browser.get('https://www.taobao.com')
    inp=browser.find_element(By.ID,'q') #找到输入框
    inp.send_keys('iphone-xs') #输入文字
    time.sleep(1)
    inp.clear() #清除文字
    time.sleep(1)
    inp.send_keys('ipad')
    button=browser.find_element_by_class_name('btn-search ') #找到搜索按钮
    button.click() #点击搜索按钮
    '''

    动作链

    没有特定的执行对象,比如鼠标拖拽、键盘按键 '''Python from selenium import webdriver from selenium.webdriver import ActionChains

    browser = webdriver.Chrome()
    browser.get('http://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) # 实例化一个ActionChains对象
    actions.drag_and_drop(source, target) # 调用drag_and_drop方法
    actions.perform() # 调用perform()方法执行
    '''

    执行JavaScript

    对于某些,selenium API并没有提供。比如下拉进度条,它可以直接模拟运行JavaScript

    '''Python
    from selenium import webdriver

    browser=webdriver.Chrome()
    browser.get('https://www.zhihu.com/explore')
    browser.execute_script('window.scrollTo(0,document.body.scrollHeight)')

    调用execute_script方法,里面执行前端的JavaScript的语句

    browser.execute_script('alert("To Bottom")')
    '''

    获取节点信息

    我们可以使用get_attribute()方法来获取节点的属性,但前提是先获取这个节点

    target = browser.find_element_by_css_selector('#droppable')
    print(target.get_attribute('class'))

    获取文本值
    target = browser.find_element_by_css_selector('#droppable')
    print(target.text)
    获取id、位置、标签名和大小
    print(target.id)
    print(target.location)
    print(target.tag_name)
    print(target.size)

    延时等待

    在selenium中,get()方法会在网页框架加载结束后结束执行,此时如果获取page_source,可能并不是浏览器完全加载完成的页面,如果某些页面有额外的ajax请求,可能不能成功获取到。 所以加一个延时等待。 等待有两种方式:隐式等待,显示等待
  • 隐式等待
  • > 当使用隐式等待时,如果selenium没有找到要找的节点,将继续等待,等待一段时间后继续查找DOM,如果超出设定的时间还没有找到,则抛出找不到的节点异常,默认时间是0

    from selenium import webdriver

    browser=webdriver.Chrome()
    browser.implicitly_wait(10) #设置隐式等待
    browser.get('https://www.zhihu.com/explore')
    inp=browser.find_element_by_class_name('zu-top-add-question')
    print(inp)

  • 显示等待
  • 隐式等待可能受网速的限制,而显示等待,制定一个最长时间,如果超过规定时间加载不出来这个节点,就返回抛出异常,如果加载出这个节点,就返回调查节点。

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

    browser=webdriver.Chrome()
    browser.get('https://www.taobao.com/')
    wait=WebDriverWait(browser,10)
    inp=wait.until(EC.presence_of_element_located((By.ID,'q'))) #代表节点出现的意思
    button=wait.until(EC.element_to_be_clickable((By.CSS_SELECTOR,'.btn-search'))) #按钮是否可以点击
    print(inp,button)

    等待条件及其含义

    title_is 标题是某内容 title_contains 标题包含某内容 presence_of_element_located 节点加载出来,传入定位元祖,如(By.ID,'p') visibility_of_element_located 节点可见,传入定位元祖 visibility_of 可见,传入节点对象 presence_of_all_elements_located 所有节点加载出来 text_to_be_present_in_element 某个节点文本包含某文字 text_to_be_present_in_element_value 某个节点的值包含某文字 frame_to_be_available_and_switch_to_it 加载并切换 invisibility_of_element_located 节点不可见 element_to_be_clickable 节点点击可见 staleness_of 判断一个节点是否仍在DOM,判断页面是否已经刷新 element_to_be_selected 节点可选择,传节点对象 element_located_to_be_selected 节点可选择,传入定位元祖 element_selection_state_to_be 传入节点对象以及状态,相等返回True,否则返回False element_located_selection_state_to_be 传入定位元祖以及状态,相等返回True,否则返回False alert_is_present 是否出现警告

    前进和后退

    from selenium import webdriver import time

    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.get('https://www.taobao.com')
    browser.get('https://www.zhihu.com')
    browser.back() #后退
    time.sleep(1)
    browser.forward() #前进
    time.sleep(2)
    browser.close()

    cookies

    使用selenium还可以方便的对cookis进行操作,例如获取,添加,删除等

    from selenium import webdriver

    browser=webdriver.Chrome()
    browser.get('https://www.zhihu.com')
    print(browser.get_cookies())
    browser.add_cookie({'name':name,'domain':'www.zhihu.com','value':'germey'})
    print(browser.get_cookies())
    browser.delete_all_cookies()
    print(browser.get_cookies())

    操作选项卡

    import time from selenium import webdriver

    browser=webdriver.Chrome()
    browser.get('https://www.baidu.com')
    browser.execute_script('window.open()') #执行JavaScript语句,打开新的选项卡
    print(browser.window_handles)
    browser.switch_to_window(browser.window_handles[1]) #切换到新的选项卡
    browser.get('https://www.taobao.com')
    time.sleep(1)
    browser.switch_to_window(browser.window_handles[0]) #切换到原来的选项卡
    browser.get('https://python.org')

    posted @ 2018-09-13 21:42  都是弟弟  阅读(280)  评论(0编辑  收藏  举报