не могу заставить xpath щелкнуть всплывающее окно в селене

1

Я пытаюсь извлечь несколько простых кодов CIK из SEC. Если вы запустите приведенный ниже код, вы получите поп о "опросе". если вы сделаете это вручную, вы его не увидите. он бомбит мой код. но поскольку он находится в селене, я не могу проверить его с помощью chropath, чтобы xpath щелкнул по "НЕТ". И я не могу воссоздать всплывающее окно в обычном браузере. Что я делаю?

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)
  • 0
    Этот код успешно запускает печать всех 4 URL. Вы можете точно указать, какое всплывающее окно появляется?
  • 0
    Weird. Тогда мне нужно будет добавить больше тикеров. Для меня это обрывает меня на 1-м или втором тикере.
Показать ещё 1 комментарий
Теги:
xpath
selenium
selenium-webdriver
selenium-chromedriver

1 ответ

2
Лучший ответ

То, что вы иногда видите, - это всплывающее окно Foresee, которое обычно отображается случайным образом.

Есть пять общих подходов, о которых я могу думать:

  • установите конкретный файл cookie, который отключил бы предусмотреть всплывающее окно "притворяясь", которое вы уже отклонили. Какой именно cookie установить точно, это открытый вопрос на данный момент. В нем есть и соответствующая тема: обрабатывать случайные всплывающие окна ForeSee с использованием Python и Selenium
  • проверьте наличие всплывающего окна полностью во время взаимодействия с веб-сайтом. Всплывающее окно не является классическим "предупреждением" в смысле селена и является просто "наложением", которое имеет это представление 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 для загрузки, например, с помощью browserermobproxy, где вы блокируете весь трафик с "foresee.com". Или, по аналогичной траектории - вы можете начать селен с блокатором рекламы, который должен/должен блокировать "предвидеть" из готового

  • или вы можете переопределить showInvite() глобального объекта "предвидеть":

    driver.execute_script("window.FSR.showInvite = function () {};")
    

    Обратите внимание, что вам нужно будет вызывать этот скрипт каждый раз сразу после перехода на новую страницу.

  • после немного обратной инженерии я обнаружил, что "предвидеть" объект 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)
    

Второй вариант, хотя и технически более сложный и более подверженный ошибкам, и замедлит работу, так как вы будете постоянно проверять наличие этого всплывающего окна. Ну, по крайней мере, пока вы не уволите его.

Четвертый вариант весьма перспективен, но я не полностью его протестировал.

Последний вариант, независимо от того, как он сумасшедший, действительно работает для меня.

  • 0
    Настоящий вопрос в том ... поверит ли вам любое тело, вы используете ежевику. даже у машины будут серьезные сомнения :)
  • 0
    Я только что попробовал уловку ежевики ... работает как шарм !!! смешное решение! Это как одеваться, как бедняк, чтобы избежать манипуляций

Ещё вопросы

Сообщество Overcoder
Наверх
Меню