目录

异步加载情况下,不涉及浏览器全局的加载,因此selenium会直接往下执行,这就导致异步结果还没返回,脚本就继续执行了。
构造chrome driver:
chrome_options = Options()
# -------------------------------------------------------------------- #
chrome_options.add_argument("--allow-running-insecure-content")
chrome_options.add_argument("--ignore-certificate-errors")
chrome_options.add_argument("--disable-single-click-autofill")
chrome_options.add_argument("--disable-autofill-keyboard-accessory-view[8]")
chrome_options.add_argument("--disable-full-form-autofill-ios")
chrome_options.add_experimental_option('perfLoggingPrefs', {
'enableNetwork': True,
'enablePage': False,
})
caps = DesiredCapabilities.CHROME
caps['goog:loggingPrefs'] = {
'browser': 'ALL',
'performance': 'ALL',
}
caps['perfLoggingPrefs'] = {
'enableNetwork': True,
'enablePage': False,
'enableTimeline': False
}
# -------------------------------------------------------------------- #
driver = webdriver.Chrome(options=chrome_options, desired_capabilities=caps)
通过log来获取xhr:
def get_xhr_logs(driver):
log_xhr_array = []
for typelog in driver.log_types:
perfs = driver.get_log(typelog)
for row in perfs:
log_data = row
message_ = log_data['message']
try:
log_json = json.loads(message_)
log = log_json['message']
if log['method'] == 'Network.responseReceived':
# 去掉静态js、css等,仅保留xhr请求
type_ = log['params']['type']
id = log['params']['requestId']
if type_.upper() == "XHR":
# log_xhr_array.append(log)
log_xhr_array.append(id)
except:
pass
return log_xhr_array
其中,上述中“message”的消息如下:
{
'method': 'Network.responseReceived',
'params': {
'frameId': '77E0FFEEDA6B3CE3ADACCD6133701429',
'loaderId': 'DA184885509BC77DB2426FCDB768E5FA',
'requestId': '5620.89',
'response': {
'connectionId': 512,
'connectionReused': False,
'encodedDataLength': 295,
'fromDiskCache': False,
'fromPrefetchCache': False,
'fromServiceWorker': False,
'headers': {
'access-control-allow-origin': '*',
'cache-control': 'no-cache',
'content-length': '271',
'content-type': 'application/json',
'date': 'Thu, 14 Apr 2022 08:15:24 GMT',
'via': '1.1 4fe583422d0b309b9b1d4505e54b137c.cloudfront.net (CloudFront)',
'x-amz-cf-id': 'bhkU5eqTsWXmJRXa1AUu2mto5kMsWoWR-ePxEFpXHeS3uUIRd-7seA==',
'x-amz-cf-pop': 'JFK51-C1',
'x-branch-request-id': '95066afcbce046c482bdea654034402a-2022041408',
'x-cache': 'Miss from cloudfront'
},
'mimeType': 'application/json',
'protocol': 'h2',
'remoteIPAddress': '192.154.249.210',
'remotePort': 9000,
'responseTime': 1649924123904.849,
'securityDetails': {
'certificateId': 0,
'certificateTransparencyCompliance': 'unknown',
'cipher': 'AES_128_GCM',
'issuer': 'DigiCert TLS RSA SHA256 2020 CA1',
'keyExchange': '',
'keyExchangeGroup': 'X25519',
'protocol': 'TLS 1.3',
'sanList': ['*.branch.io', 'branch.io'],
'signedCertificateTimestampList': [],
'subjectName': '*.branch.io',
'validFrom': 1635292800,
'validTo': 1669593599
},
'securityState': 'secure',
'status': 200,
'statusText': '',
'timing': {
'connectEnd': 1470.717,
'connectStart': 0.071,
'dnsEnd': -1,
'dnsStart': -1,
'proxyEnd': -1,
'proxyStart': -1,
'pushEnd': 0,
'pushStart': 0,
'receiveHeadersEnd': 2177.895,
'requestTime': 233026.325475,
'sendEnd': 1471.578,
'sendStart': 1471.22,
'sslEnd': 1470.707,
'sslStart': 961.743,
'workerFetchStart': -1,
'workerReady': -1,
'workerRespondWithSettled': -1,
'workerStart': -1
},
'url': 'https://api2.branch.io/v1/open'
},
'timestamp': 233028.504486,
'type': 'XHR'
}
}
通过requestId可以获得详细的消息体:
def get_xhr_body(driver, requestId):
response_body = driver.execute_cdp_cmd('Network.getResponseBody', {'requestId': requestId})
return response_body
driver.find_element(by=By.XPATH, value='//*[@id="main"]/div[1]/form/button').send_keys(Keys.ENTER)
response = None
login_type = LoginType.Fail
while True:
ids = get_xhr_logs(driver)
print('>> 等待异步加载中...')
if ids:
for id in ids:
try:
body = get_xhr_body(driver, id)
response = eval(body['body'])
print(response)
if response.get('token'):
login_type = LoginType.Success
break
except Exception:
pass
break
time.sleep(0.5)
return login_type, response
Github:https://github.com/wkeeling/selenium-wire
与selenium无缝衔接,非常好用~~
示例代码后期再补,可先自行前往官网查看。
我正在学习如何使用Nokogiri,根据这段代码我遇到了一些问题:require'rubygems'require'mechanize'post_agent=WWW::Mechanize.newpost_page=post_agent.get('http://www.vbulletin.org/forum/showthread.php?t=230708')puts"\nabsolutepathwithtbodygivesnil"putspost_page.parser.xpath('/html/body/div/div/div/div/div/table/tbody/tr/td/div
总的来说,我对ruby还比较陌生,我正在为我正在创建的对象编写一些rspec测试用例。许多测试用例都非常基础,我只是想确保正确填充和返回值。我想知道是否有办法使用循环结构来执行此操作。不必为我要测试的每个方法都设置一个assertEquals。例如:describeitem,"TestingtheItem"doit"willhaveanullvaluetostart"doitem=Item.new#HereIcoulddotheitem.name.shouldbe_nil#thenIcoulddoitem.category.shouldbe_nilendend但我想要一些方法来使用
类classAprivatedeffooputs:fooendpublicdefbarputs:barendprivatedefzimputs:zimendprotecteddefdibputs:dibendendA的实例a=A.new测试a.foorescueputs:faila.barrescueputs:faila.zimrescueputs:faila.dibrescueputs:faila.gazrescueputs:fail测试输出failbarfailfailfail.发送测试[:foo,:bar,:zim,:dib,:gaz].each{|m|a.send(m)resc
我正在尝试设置一个puppet节点,但rubygems似乎不正常。如果我通过它自己的二进制文件(/usr/lib/ruby/gems/1.8/gems/facter-1.5.8/bin/facter)在cli上运行facter,它工作正常,但如果我通过由rubygems(/usr/bin/facter)安装的二进制文件,它抛出:/usr/lib/ruby/1.8/facter/uptime.rb:11:undefinedmethod`get_uptime'forFacter::Util::Uptime:Module(NoMethodError)from/usr/lib/ruby
我想了解Ruby方法methods()是如何工作的。我尝试使用“ruby方法”在Google上搜索,但这不是我需要的。我也看过ruby-doc.org,但我没有找到这种方法。你能详细解释一下它是如何工作的或者给我一个链接吗?更新我用methods()方法做了实验,得到了这样的结果:'labrat'代码classFirstdeffirst_instance_mymethodenddefself.first_class_mymethodendendclassSecond使用类#returnsavailablemethodslistforclassandancestorsputsSeco
Rackup通过Rack的默认处理程序成功运行任何Rack应用程序。例如:classRackAppdefcall(environment)['200',{'Content-Type'=>'text/html'},["Helloworld"]]endendrunRackApp.new但是当最后一行更改为使用Rack的内置CGI处理程序时,rackup给出“NoMethodErrorat/undefinedmethod`call'fornil:NilClass”:Rack::Handler::CGI.runRackApp.newRack的其他内置处理程序也提出了同样的反对意见。例如Rack
我在我的项目中添加了一个系统来重置用户密码并通过电子邮件将密码发送给他,以防他忘记密码。昨天它运行良好(当我实现它时)。当我今天尝试启动服务器时,出现以下错误。=>BootingWEBrick=>Rails3.2.1applicationstartingindevelopmentonhttp://0.0.0.0:3000=>Callwith-dtodetach=>Ctrl-CtoshutdownserverExiting/Users/vinayshenoy/.rvm/gems/ruby-1.9.3-p0/gems/actionmailer-3.2.1/lib/action_mailer
exe应该在我打开页面时运行。异步进程需要运行。有什么方法可以在ruby中使用两个参数异步运行exe吗?我已经尝试过ruby命令-system()、exec()但它正在等待过程完成。我需要用参数启动exe,无需等待进程完成是否有任何rubygems会支持我的问题? 最佳答案 您可以使用Process.spawn和Process.wait2:pid=Process.spawn'your.exe','--option'#Later...pid,status=Process.wait2pid您的程序将作为解释器的子进程执行。除
设置:狂欢ruby1.9.2高线(1.6.13)描述:我已经相当习惯在其他一些项目中使用highline,但已经有几个月没有使用它了。现在,在Ruby1.9.2上全新安装时,它似乎不允许在同一行回答提示。所以以前我会看到类似的东西:require"highline/import"ask"Whatisyourfavoritecolor?"并得到:Whatisyourfavoritecolor?|现在我看到类似的东西:Whatisyourfavoritecolor?|竖线(|)符号是我的终端光标。知道为什么会发生这种变化吗? 最佳答案
鉴于我有以下迁移:Sequel.migrationdoupdoalter_table:usersdoadd_column:is_admin,:default=>falseend#SequelrunsaDESCRIBEtablestatement,whenthemodelisloaded.#Atthispoint,itdoesnotknowthatusershaveais_adminflag.#Soitfails.@user=User.find(:email=>"admin@fancy-startup.example")@user.is_admin=true@user.save!ende