
在selenium中我们有时候也会看到这样定位元素的方法 driverfind_elements(ByCLASS_NAME, 'YT') , 如果要用到这样的写法,是需要导入By这个模块也就是 from seleniumwebdrivercommonby import By ;By模块,用来定位元素的。和另外一个find的功能一样,就是写法不一样。
区别就是: 当element变成elements时,写法不变,就是返回的元素由返回单个元素变成了返回一个数组。
find_element 是查找一个元素对象并返回元素对象。当页面有多个元素对象时返回第一个找到的元素。
find_elements是查找页面所有元素并返回元素对象列表可以通过下标获取元素对象。a[0] 即第一个元素对象与find_element等效。
cefsharp新手慎用,用的是js代码,可以获取元素修改元素,但是使用js。
var frame = cbGetMainFrame();var task = frameEvaluateScriptAsync("(function() { return documentgetElementsByTagName('input')[0]value; })();", null);
这段代码你要充分利用py抓取到可靠信息,知道第一个input是什么,而且有value属性,不然就会报错。
frameEvaluateScriptAsync()允许你写入js片段。
网页抓捕当中我觉得这个还是靠谱的,现在C#有很多,webbrowser、webkitbrowser、geckofx、webkitsharp都是些噱头,一般的网页都无法搞定。
py的webdriver和android的webview同出一辙,跟webkit一样。
但是获取信息是不行的,比如我要抓取哪个元素值,你老老实实先把decument对象获取到,再抓。
在python的webdriver中,可以使用driverback()方法来返回,这是因为该方法可以模拟浏览器的后退按钮,因此可以返回到以前访问过的页面。Python的Webdriver可以使用return语句来返回一个值。这是因为return语句可以将一个函数执行的结果返回给调用函数,这样调用函数就可以使用返回的结果做一些处理。
查到Remote_connection 里面的exceute方法中,链接url的response 报错 404。 猜测是在跳转到支付页面时,先断开之前的链接,再去请求支付的链接,而断开时,请求的链接就会返回404
解决方法:可以先用timesleep 等待几秒钟去链接新的页面,然后再用 driverimplicitly_wait 方法就可以了
将获取元素和动作拆分开来
解决方法如下:
getcode = driverfind_element_by_id("commingyuandwinmall:id/btn_get_code")
timesleep(50)
getcodeclick()
电脑关机,然后在开机时按住 command + R 键 ,直到出现苹果 logo 和进度条时松开,进入OS X恢复模式。在终端输入命令csrutil disable,然后关闭终端。进入恢复模式后打开 实用工具 —— 终端
mv: rename chromedriver to /usr/bin/chromedriver: Read-only file system
然后百度的时候我又找到这样的一篇文章,参考类似的问题,我试着直接执行如下命令挂载写入权限
sudo mount -uw /这时候再试一次sudo mv chromedriver /usr/bin
ele = driverfind_element_by_xpath ("//p[@class='comment-form-rating-btn']/button" )# star
webdriverActionChains ( driver )move_to_element ( ele )click ( ele )perform ()
解决方法:切换到最后一个窗口
windows =selfdriverwindow_handles
selfdriverswitch_towindow (-1)
6'list' object has no attribute 'click'
将”driverfind_elements_by_xpath“改为“driverfind_element_by_xpath”即可解决。
# coding:utf-8
from seleniumimport webdriver
from seleniumwebdriversupportwaitimport WebDriverWait
from seleniumwebdriversupportimport expected_conditionsas EC
from seleniumwebdrivercommonbyimport By
from seleniumwebdrivercommonaction_chainsimport ActionChains
from seleniumwebdriversupportselectimport Select
# By的用法
# driverfind_element("id", "kw")
# driverfind_element(ByID, "kw")
class Base():
'''基于原生的selenium做二次封装'''
def __init__(self, driver):
selfdriver = driver
selftimeout =10
selft =05
def findElement(self, locator, value=''):
'''定位元素,返回元素对象,10s钟没定位到,Timeout异常,locator传元组'''
if not isinstance(locator, tuple):
print("locator的参数类型错误,必须穿元组类型,如:('id', 'kw')")
else:
print("正在定位元素,定位方式为→{0},定位元素为→{1}"format(locator[0], locator[1]))
if value !='':# value 值定位
ele = WebDriverWait(selfdriver, selftimeout, selft)until(
ECtext_to_be_present_in_element_value(locator, value))
return ele
else:# 默认为此方法常规定位
try:
ele = WebDriverWait(selfdriver, selftimeout, selft)until(
ECpresence_of_element_located(locator))
return ele
except:
print("定位失败,定位方式为→{0},定位元素为→{1}"format(locator[0], locator[1]))
return []
def findElements(self, locator, value=''):
'''定位元素,返回元素对象,10s钟没定位到,Timeout异常,locator传元组'''
if not isinstance(locator, tuple):
print("locator的参数类型错误,必须穿元组类型,如:('id', 'kw')")
else:
print("正在定位元素,定位方式为→{0},定位元素为→{1}"format(locator[0], locator[1]))
if value !='':# value 值定位
eles = WebDriverWait(selfdriver, selftimeout, selft)until(
ECtext_to_be_present_in_element_value(locator, value))
return eles
else:# 默认为此方法常规定位
try:
eles = WebDriverWait(selfdriver, selftimeout, selft)until(
ECpresence_of_all_elements_located(locator))
return eles
except:
print("定位失败,定位方式为→{0},定位元素为→{1}"format(locator[0], locator[1]))
return []
def sendKeys(self, locator, text=''):
try:
selffindElement(locator)send_keys(text)
except:
print("text:%s输入错误" % text)
def click(self, locator):
try:
selffindElement(locator)click()
except:
print("点击失败")
def clear(self, locator):
try:
selffindElement(locator)clear()
except:
print("清空内容失败")
def isSelected(self, locator, Type=''):
''' 判断元素是否被选中,返回bool值 及点(选中/取消选中)'''
ele =selffind(locator)
try:
if Type =='':# 如果type参数为空,返回元素是否为选中状态,True/False (默认)
r = eleis_selected()
return r
elif Type =='click':# 如果type参数为click,执行元素的点击 *** 作
eleclick()
else:
print("type参数 {0} 错误,仅可为click或"format(Type))
except:
return False
def isElementExist(self, locator):
'''判断单个元素是否在DOM(元素树)里面'''
try:
selffindElement(locator)
return True
except:
return False
def is_title(self, title=''):
'''判断当前页面title是否为title,返回bool值'''
try:
result = WebDriverWait(selfdriver, selftimeout, selft)until(ECtitle_is(title))
return result
except:
return False
def is_title_contains(self, title=''):
'''判断当前页面title名是否含有title,返回bool值'''
try:
result = WebDriverWait(selfdriver, selftimeout, selft)until(ECtitle_contains(title))
return result
except:
return False
def is_text_in_element(self, locator, text=''):
'''判断当前获取到的text含text,返回bool值'''
try:
result = WebDriverWait(selfdriver, selftimeout, selft)until(
ECtext_to_be_present_in_element(locator, text))
return result
except:
return False
def is_value_in_element(self, locator, _value=''):
'''返回bool值, value为空字符串,返回False'''
if not isinstance(locator, tuple):
print('locator参数类型错误,必须传元祖类型:loc = ("id", "value1")')
try:
result = WebDriverWait(selfdriver, selftimeout, selft)until(
ECtext_to_be_present_in_element_value(locator, _value))
return result
except:
return False
def get_title(self):
'''获取title'''
return selfdrivertitle
def get_text(self, locator):
'''获取文本'''
try:
result =selffindElement(locator)text
return result
except:
print("获取text失败")
return ""
def get_attribute(self, locator, name):
'''获取属性'''
try:
element =selffindElement(locator)
return elementget_attribute(name)
except:
print("获取%s属性失败" % name)
return ""
def select_by_index(self, locator, index=0):
'''通过索引,index是索引第几个,从0开始,默认选第一个'''
element =selffind(locator)# 定位select这一栏
Select(element)select_by_index(index)
def select_by_value(self, locator, value):
'''通过value属性'''
element =selffind(locator)
Select(element)select_by_value(value)
def select_by_text(self, locator, text):
'''通过文本值定位'''
element =selffind(locator)
Select(element)select_by_visible_text(text)
# 这里只写了几种方法,后续有需要用到的定位方法或者 *** 作,可以继续封装起来然后调用
if __name__ =='__main__':
driver = webdriverChrome()
web = Base(driver)
driverget(">
您可以尝试使用elementget_attribute('value')来获取该元素的值,因为可能该元素的文本值并非可见文本,而是元素的值属性。代码示例:
如果仍然无法获取到值,可以检查一下该元素是否在页面加载完成后出现,或者是否有iframe或frame嵌套,需要先切换到相应的iframe或frame才能找到该元素。
以上就是关于selenium中find_element和find_elements的区别全部的内容,包括:selenium中find_element和find_elements的区别、c# cefsharp能不能像webbrowser那样获取到元素,修改这个元素的属性呢、python的webdriver中怎么返回等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
微信扫一扫
支付宝扫一扫
评论列表(0条)