Код Python Selenium отлично работает, когда не безголовый, но даже не начинается с безголового - PullRequest
0 голосов
/ 25 сентября 2019

Так что проблема очень проста.У меня есть код, который мне нужно запустить в режиме без головы.Эта программа прекрасно работает в режиме без заголовка (когда браузер автоматически открывается селеном), но в тот момент, когда я отключаю безголовый, он даже не запускается.

import requests
from bs4 import BeautifulSoup
import csv
from selenium import webdriver
from selenium.webdriver.support.ui import Select
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.options import Options
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
import time

chromepath = r"C:\Users\hp\Desktop\webScrape\chromedriver\chromedriver.exe"
options = Options()
#options.add_argument("--headless")
options.add_argument('--disable-gpu')
options.add_argument('--log-level=3')
options.add_argument('--lang=en')
driver = webdriver.Chrome(executable_path=chromepath, chrome_options=options)
url = "https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/ownership.jhtml?stockspage=ownership&symbols=AAPL"
driver.get(url)
print("driver got url")

if driver.current_url == "https://login.fidelity.com/ftgw/Fidelity/RtlCust/Login/Init/df.chf.ra/trial?AuthRedUrl=https://oltx.fidelity.com/ftgw/webxpress/AuthorizeMember&AuthOrigUrl=https://snapshot.fidelity.com/fidresearch/gotoBL/snapshot/landing.jhtml#/dividends?symbol=AAPL":


        username = driver.find_element_by_id("userId")
        password = driver.find_element_by_id("password")

        username.send_keys("xxxx")
        password.send_keys("xxxx")

        login = driver.find_element_by_xpath('//*[@id="Login"]/ol/li[4]/button/b').click()

        driver.get(url)
        #print(driver.current_url)


        button = element = WebDriverWait(driver, 60).until(
            EC.element_to_be_clickable((By.XPATH, '//*[@id="tab1"]/a'))
        )

        button.click()
        print("clicked")
#use webdriver wait for everything else
# table = wait.until(EC.presence_of_element_located(By.CSS_SELECTOR, 'div.datatable'))
try:
    WebDriverWait(driver, 60).until(EC.presence_of_element_located((By.XPATH, '/html/body/table/tbody/tr/td[4]/div[5]')))

except:
    pass  # Handle the exception here


# thlist = []
# tdlist = []   

# my_table_th = driver.find_elements_by_tag_name('th')
# for i in range(0,len(my_table_th)):
    # if my_table_th[i].text == "":
        # continue
    # else:
        # thlist.append(my_table_th[i].text)


# my_table_td = driver.find_elements_by_tag_name('td')
# for i in range(0,len(my_table_td)):
    # if my_table_td[i].text == "":
        # continue
    # else:
        # tdlist.append(my_table_td[i].text)        

# thlist = thlist[8:]       
# for i in range(0,len(thlist)):
    # print(i,thlist[i])

# print("-----------------------------------------------------")

# for i in range(0,len(tdlist)):
    # print(i,tdlist[i])
mylist = [] 

soup = BeautifulSoup(driver.page_source,"html.parser")
print("bs got the site")
requests.packages.urllib3.disable_warnings()

#table borderTop table-striped dividendHistory
divparent = soup.find_all('div', attrs={'class':'tabbed-box'})
#print (len(divparent))
"""
table 1 is class left side and chart-table
table 2 is class right side and institutional-table

"""
try:
        my_table = divparent[0].find_all('div', attrs = {'class':'left-side'})
        #print((my_table))
except:
    print("no table div here!")
    #return
#try:
extractTable = my_table[0].find_all('table', attrs = {'class':'chart-table'})
rows = extractTable[0].findChildren(['tr'])
for row in rows:
    for data in row.findAll('th'):
        if data.text == "":
            continue
        else:
            print(data.text)

driver.close()
print("done ^_^")

Так что, когда параметр без заголовка комментируется, он работает отлично, но когда он не прокомментирован, программа даже не запустится.Единственное, что я вижу на своей консоли, это:

  driver = webdriver.Chrome(executable_path=chromepath, chrome_options=options)

DevTools listening on ws://127.0.0.1:62897/devtools/browser/df3dccb4-4b97-4b06-8ca3-545d64ca2807

Он никогда не перейдет к первому выводу на печать, который

print("driver got url")

Может кто-нибудь помочь с этим?

1 Ответ

0 голосов
/ 25 сентября 2019

РЕШЕНИЕ:

При определении драйвера я изменил ключевое слово chrome_options на options.Скачал правильный хром-драйвер (соответствует моему chromebrowser).

Расширение:

Скопировал (первый бит) ваш код и столкнулся с похожимпроблема.Сделал несколько изменений и получил его для запуска (без головы).Вот первая часть вашего кода (измененная), которая будет выполняться:

from selenium import webdriver
from selenium.webdriver.chrome.options import Options
import os, platform

BASE_DIR = os.path.dirname(os.path.abspath(__file__))

if platform.system() == 'Windows':
    chromepath = BASE_DIR + r'\chromedriver.exe'
    chromepath = chromepath.replace("\\","/")

options = Options()
options.add_argument('--headless')
options.add_argument('--disable-gpu')
options.add_argument('--log-level=3')
options.add_argument('--lang=en')


print("define driver")
driver = webdriver.Chrome(executable_path=chromepath, options=options)

print("define url")
url1 = "https://eresearch.fidelity.com/eresearch/evaluate/fundamentals/ownership.jhtml?stockspage=ownership&symbols=AAPL"
print("define url2")
url2 = "https://youtube.com"

print("driver: start getting url2")
driver.get(url2)
print("driver got url2")

print("driver: start getting url1")
driver.get(url1)
print("driver got url1")

Примечание: я сделал предположение, что исполняемый файл chromedriver находится в том же каталоге, что и ваш .py файл.

Дополнительная проблема:

Также я добавил несколько операторов print, чтобы проверить, какой бит кода выполняется.Делая это, я обнаружил, что драйвер, кажется, не получает ваш URL (подождал 5 минут, и он все еще работал).При использовании другого URL-адреса код запускается, поэтому причина этого (другого), вероятно, кроется в том, какой веб-сайт вы пытаетесь посетить.

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

...