我正在尝试编写一个脚本,以确定潜在的新家庭是否有可用的Verizon FiOS服务。
不幸的是,该网站对javascript的广泛使用使一切都无法正常工作。我使用selenium(封装在split模块中)让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()