无法让XPath单击硒中的弹出窗口
问题内容:
我正在尝试从“ SEC”中提取一些简单的“
CIK”代码。如果您运行下面的代码,您将获得有关“调查”的提示。如果您手动进行操作,则看不到它。它炸毁了我的代码。但是由于它在硒中,所以我无法使用chropath对其进行检查以使xpath单击“
NO”。而且我无法在普通浏览器中重新创建弹出窗口。我该怎么办?
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.support.wait import WebDriverWait
from selenium.webdriver.common.by import By
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
import time
from random import randint
path ='C:\\Users\\Jason\\Google Drive\\python\\chromedriver.exe'
ticker='alrm'
main='https://www.sec.gov/search/search.htm'
driver=webdriver.Chrome(path)
tickers=['AAL','AAN','AAOI','AAPL']
# starts the process
def get_CIK(ticker):
driver.get(main)
stock_code = WebDriverWait(driver, 10).until(EC.element_to_be_clickable((By.ID, "cik")))
stock_code.click()
stock_code.send_keys(ticker)
driver.find_element_by_xpath("//input[@value='Find Companies']").click() # click on search buttom
link = driver.find_element_by_xpath("/html[1]/body[1]/div[4]/div[1]/div[3]/span[1]/a[1]").get_attribute("href") # get link
cik= link[link.index('CIK=')+4:link.index("owner")-1] # extract cik
print cik
for i in tickers:
get_CIK(i)
问题答案:
您偶尔会看到的是 “预见弹出窗口” ,该 弹出窗口 通常会随机显示。
我可以想到5种通用方法:
- 设置一个特定的cookie ,该 cookie 将禁止预见弹出窗口“假装”您已经将其关闭。目前究竟要设置哪个cookie是一个悬而未决的问题。也有与此相关的线程:使用Python和Selenium处理随机的ForeSee弹出窗口
- *在与网站交互期间,始终 *检查“弹出窗口”的存在 。弹出窗口不是硒意义上的经典“警报”,而 只是 具有以下HTML表示形式 的“覆盖” :
<div class="__acs " aria-labelledby="fsrHeading"> <div class="acsModalBackdrop acsAbandonButton" data-isbackdrop="true"> <div class="acsFocusFirst acsClassicInvite" tabindex="1" id="acsMainInvite" role="dialog" aria-labelledby="fsrHeading"> <div class="acsClassicInner" role="document"> <div class="acsLogoSpacer"><img src="//gateway.foresee.com/sites/sec-gov/production/trigger/sitelogo.png" class="acsSiteLogo" title="" alt=""> <img src="https://static.foresee.com/logos/foresee/150_67.png" class="acsNoDisplay" title="ForeSee" alt="ForeSee"> <div title="ForeSee" alt="ForeSee" class="acsVendorLogoSVG"></div> ...
然后,您可以例如检查“拒绝”按钮的存在,然后单击是否存在:
<a href="#" tabindex="2" class="acsInviteButton acsDeclineButton" title="" role="button"></a>
-
您还可以 “阻止”预见 要加载的 JS脚本 ,例如,使用浏览器mobproxy来阻止来自“ foresee.com”的所有流量。或者,在类似的轨迹上-您可以从广告拦截器开始硒,该广告拦截器可以开箱即用地阻止“预见”
-
或者,你可以 重写
showInvite()
功能的“先知先觉”全局对象:driver.execute_script("window.FSR.showInvite = function () {};")
请注意,导航到新页面后,您每次都需要调用此脚本。
- 经过一些反向工程后,我发现“ foresee” JS对象具有此全局配置,其中包含许多有趣的信息,包括 设备黑名单 :
device_blacklist: ["HTC_Rezound", "blackberry"]
然后,您可以覆盖浏览器的用户代理,并假装它来自某个Blackberry设备:
BLACKBERRY_UA = "Mozilla/5.0 (BlackBerry; U; BlackBerry 9900; en) AppleWebKit/534.11+ (KHTML, like Gecko) Version/7.1.0.346 Mobile Safari/534.11+"
opts = Options()
opts.add_argument("user-agent={0}".format(BLACKBERRY_UA))
driver = webdriver.Chrome(chrome_options=opts)
第二个选项虽然在技术上更具挑战性且更容易出错,但由于您会不断检查是否存在此弹出窗口,因此会降低速度。好吧,至少直到您解雇它为止。
第四个选项很有希望,但我尚未对其进行全面测试。
最后一个选项,不管听起来多么疯狂,实际上对我来说都是有效的。