使用Selenium/Splinter抓取延迟的Ajax内容
我正在尝试写一个脚本,来判断潜在的新房子是否可以使用Verizon FiOS网络。
可惜的是,这个网站大量使用了javascript,导致我的脚本无法正常工作。我正在使用selenium(通过splinter模块)来让javascript执行,但我无法通过第二页。
下面是脚本的简化版本:
from splinter import Browser
browser = Browser()
browser.visit('https://www.verizon.com/FORYOURHOME/ORDERING/OrderNew/OrderAddressInfo.aspx')
nameAddress1 = "ctl00$body_content$txtAddress"
nameZip = "ctl00$body_content$txtZip"
formFill = {nameAddress1: '46 Demarest Ave',
nameZip: '10956'}
browser.fill_form(formFill)
browser.find_by_id('btnContinue').first.click()
if browser.is_element_present_by_id('rdoAddressOption0', wait_time=10):
browser.find_by_id('rdoAddressOption0').first.click()
browser.find_by_id('body_content_btnContinue').first.click()
在这个例子中,当系统询问确认地址时,它选择了第一个选项。
但是它出现了一个错误,叫做ElementNotVisibleException。如果我去掉is_element_present的检查,它又会因为找不到元素而出错。虽然在selenium控制的真实浏览器中,这个元素是可见并且可以点击的,但看起来selenium并没有看到页面HTML的最新版本。
作为替代方案,我想我可以尝试用POST请求来处理响应,使用requests或mechanize模块,但有一些奇怪的重定向让我搞不懂。
我该如何让selenium正常工作,或者绕过javascript/ajax,直接用GET和POST请求呢?
1 个回答
1
问题在于,你点击的输入框其实是被隐藏起来了,因为它的样式设置了 display: none
。
为了绕过这个问题,可以执行一些JavaScript代码来点击这个输入框,并设置它的 checked
属性:
browser.execute_script("""var element = document.getElementById('rdoAddressOption0');
element.click();
element.checked=true;""")
browser.find_by_id('body_content_btnContinue').first.click()