Skip to main content
 首页 » 编程设计

python之使用 Selenium/Splinter 抓取延迟的 ajax

2025年05月04日26davidwang456

我正在尝试编写一个脚本来确定潜在的新家庭是否可以使用 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 请求并使用请求或机械化处理响应,但是有某种有趣的重定向我无法理解。

我如何让 selenium 正常运行,或者绕过 javascript/ajax 并使用 GET 和 POST 请求来完成?

请您参考如下方法:

问题是通过设置 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()