当前位置:   article > 正文

selenium问题记录

selenium问题
一、设置cookie技巧

selenium中,我们通常使用函数get_cookies()来得到当前driver的cookie值组,之所以说是组,是因为某些在大多数网站所得到的cookie值都有多个,所以我们通过函数get_cookies()得到的通常是一个列表,列表中的元素是字典。每一个字典为一组cookie值,其中包括namevalueexpiry等字段。

通常我们保存cookie值是为了去绕过某些网站的账号密码检测,对某些页面实现免密访问,保存cookie值建议使用pickle包来保存,它可以对列表字典这些类型用二进制的方式进行持久化保存,而不需要我们在做过多的处理。需要读取所保存的cookie值也非常的方便。示例如下:

# 读取cookie
def get_cookies():
    with open('cookies.pickle', 'rb') as f:
        cookies = pickle.load(f)

    return cookies
# 保存cookie    
def set_cookies():
    cookies = browser.get_cookies()
    with open('cookies.pickle', 'wb') as f:
        pickle.dump(cookies, f)
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11

另外一个需要注意的地方就是对某个请求添加cookie值,在selenium中是通过add_cookie()方法来设置cookie值,这个方法接收的参数为一个字典,也就意味着我们需要将cookie值一组一组的进行添加,我们以新浪微博为例,微博的某一组cookie值如下所示:

{
    u'domain': u'.m.weibo.cn', 
    u'secure': False, 
    u'value': u'93490a', 
    u'expiry': 1598594266, 
    u'path': u'/', 
    u'httpOnly': False, 
    u'name': u'XSRF-TOKEN'
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9

在调用add_cookie()方法时需传入的字典即为这种结构,若我们要设置多组cookie值的话,就需要一个循环来处理,示例如下所示:

for item in cookies:
    browser.add_cookie({
                    'domain': item['domain'],
                    'secure': item['secure'],
                    'value': item['value'],
                    'expiry': item['expiry'],
                    'path': item['path'],
                    'httpOnly': item['httpOnly'],
                    'name': item['name'],
                })
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
二、模拟点击

我们使用selenium库通常有两个原因,一个是它可以模拟JavaScript的渲染过程,然后我们直接抓取渲染后的结果,另一个就是它支持模拟点击。

但我们有时候在模拟点击时可能会遇见下面的报错。

selenium.common.exceptions.ElementClickInterceptedException: Message: element click intercepted: … Other element would receive the click: …

这个错误的原因是我们将点击的哪个元素被其他元素在界面上遮挡了,无法点击到该元素,在搜索引擎的帮助下,我发现大家解决这个问题的方法基本上都是用send_key("\n")去代替click()函数,但我这样使用时并没有解决这个问题,后面我想了想我们可以通过js代码来控制窗口的滑动从而使我们将要点击的元素可见。因此我们可以通过execute_script()函数执行js代码来滑动浏览器窗口至元素可见后再使用动作链来实现模拟点击。代码如下:

browser.execute_script("arguments[0].scrollIntoView();", btn)
btn.click()
  • 1
  • 2

这样就解决了这个问题。

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

闽ICP备14008679号