Selenium中对于颜色的处理及拓展
获取百度一下按钮的背景色
from selenium import webdriver
from time import sleep
driver = webdriver.Chrome()
driver.get('https://www.baidu.com')
# 找到百度一下这个按钮元素
ele_baidu = driver.find_element('id','su')
# 获取其css属性background-color
color = ele_baidu.value_of_css_property('background-color')
print(color) #rgba(78, 110, 242, 1)
print(type(color)) # str类型
- 从上面的demo中可以看出来,value_of_css_property得到的是一个str类型的字符串
- 颜色的表达式很多类型的,rgba(78, 110, 242, 1)是一种,还有#FFFFFF这样
selenium中对于颜色的处理
-
selenium提供了一个类Color专门用于对颜色进行转换处理
color = 'rgba(78, 110, 242, 1)' print(Color.from_string(color).hex) # #4e6ef2
-
看看源码,它是怎么实现的
@classmethod def from_string(cls, str_: str) -> Color: # 类方法,传入str(颜色),返回一个Color实例
# Color的init def __init__(self, red: ParseableInt, green: ParseableInt, blue: ParseableInt, alpha: ParseableFloat = 1) -> None: self.red = int(red) self.green = int(green) self.blue = int(blue) self.alpha = "1" if float(alpha) == 1 else str(float(alpha) or 0)
# 那实例的参数怎么来的呢, 关键是正则 elif m.match(RGBA_PATTERN, str_): return cls(*m.groups) # 其中PATTERN很关键 RGBA_PATTERN = r"^\s*rgba\(\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(\d{1,3})\s*,\s*(0|1|0\.\d+)\s*\)\s*$"
@property def hex(self) -> str: return f"#{self.red:02x}{self.green:02x}{self.blue:02x}"
-
综上:from_string类方法传入字符串'rgba(78, 110, 242, 1)',根据正则RGBA_PATTERN解析得到三元组,对Color进行实例化,进而调用hex方法(装饰为属性),得到一个转换后的#4e6ef2
自定义方法实现
-
上面的方法无疑是非常牛的,对正则比较熟悉的话可以借鉴,但我写不出来这样的正则
-
我们可以用非常简单的方法来做(适配性不会那么好)
-
无非就是对一个字符串'rgba(78, 110, 242, 1)'中的数字进行转换#4e6ef2 ,不考虑alpha的话
-
由于有形式是rgb的,归纳为第一个(左括号后面的3个数字字符,拿到后转换下即可。
-
demo
color = 'rgba(78, 110, 242, 1)' print(color.index('(')) # 左括号的index print(color.index(')')) # 右括号的index print(color[color.index('(')+1:color.index(')')]) # 左右括号中间的部分 print(color[color.index('(')+1:color.index(')')].split(',')[:3]) # 用,切割 rgb = color[color.index('(')+1:color.index(')')].split(',')[:3] print('#'+''.join([hex(int(_.strip()))[-2:] for _ in rgb])) # #4e6ef2
-
稍作封装
def colorstr_to_hex(colorstr): start = colorstr.index('(') end = colorstr.index(')') rgb = colorstr[start+1:end].split(',')[:3] return '#'+''.join([hex(int(_.strip()))[-2:] for _ in rgb]) color = 'rgba(78, 110, 242, 1)' print(colorstr_to_hex(color)) # #4e6ef2
逆向hex_to_rgb
def hex_to_rgb(hexstr):
return tuple(int(hexstr.lstrip('#')[i:i+2], 16) for i in (0, 2, 4))
print(hex_to_rgb('#4e6ef2'))
- 这里就涉及一些Python内置对象的使用,可以参考我写的另外一篇博文,Python内置对象(一)