使用Selenium/Splinter抓取延迟的Ajax内容

2 投票
1 回答
857 浏览
提问于 2025-04-18 02:49

我正在尝试写一个脚本,来判断潜在的新房子是否可以使用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()

撰写回答