Как получить доступ к источнику из выпадающего меню - PullRequest
0 голосов
/ 05 марта 2020

Я действительно новичок в python и программировании, я хочу очистить данные с помощью find_all(class_="randomname"), какое имя класса можно найти с помощью "просмотра исходного кода страницы" с веб-сайта, но дело в том, что я просто понимаю, что Я хочу очистить данные всех названий регионов, которые не отображаются в исходной странице просмотра. Я имею в виду, это предполагает быть на странице источника, не так ли? даже если это повторный поиск при поиске, я знаю, что в этом меню есть таблица или любое другое имя, наверняка я могу щелкнуть правой кнопкой мыши по одному из названий региона и проверить элемент, но не могу получить доступ к нему через источник просмотра страницы, который, я думаю, единственный способ сказать python до find_all(class_="randomname") из viewpagesource. Я надеюсь, вы понимаете, о чем я. Как я могу получить доступ к этому элементу?

это мой код, до сих пор я могу только щелкнуть мышью с помощью положения мыши:

import time
from pynput.mouse import Button, Controller as mouseC
from pynput.keyboard import Key, Controller as keyC
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

# I'm trying to use mouse click, and keyboard input later
mouse, keyboard = mouseC(),keyC()

driver = webdriver.Chrome()
driver.get("https://bpjs-kesehatan.go.id/bpjs/")
driver.maximize_window()
wait = WebDriverWait(driver, 4)

# what i'm trying to do here, the button that I want to click later
# that is "download button" which doesnt have element like 
# "inspect element", I cant right click on it, they say cause it's tableau 
# the only thing I can do to access this download, by using mouse click 
# so I need to make the position visible on the screen, first thing I move
# the screen to the nearest element that can be found to this "tableau"
# then I'm doing scrolling a bit till the "tableau" visible
element = driver.find_element_by_xpath("/html/body/section[2]/div")
element.location_once_scrolled_into_view
driver.execute_script("window.scrollTo(0, 500)")

# code to take out the unneeded blue pop up
time.sleep(4)
mouse.position = (1017,313)
mouse.click(Button.left,1)
time.sleep(4)

# click Pembayaran klaim, this tab that I want to download the data
mouse.position = (337,269)
mouse.click(Button.left,1)
time.sleep(4)

# Click section provinsi, this tab that I want to access/scrap all of available option
mouse.position = (1143,322)
mouse.click(Button.left,1)
time.sleep(4)

# typing the provinsi name, what I planned is if I can access/scrap all of this element, I can do the "looping download" as many as this items
for char in "BALI":
    time.sleep(0.12)
    keyboard.press(char)
    keyboard.release(char)
time.sleep(4)
mouse.position = (1036,362)    
mouse.click(Button.left,1)
time.sleep(4)

#klik blok RS
mouse.position = (1134,369)
mouse.click(Button.left,1)
time.sleep(4)

#pilih RS
for char in "RS BALIMED":
    time.sleep(0.12)
    keyboard.press(char)
    keyboard.release(char)
time.sleep(4)
mouse.position = (1055,418)    
mouse.click(Button.left,1)
time.sleep(4)

#klik Download
mouse.position = (1092,645)
mouse.click(Button.left,1)
time.sleep(4)

#klik PDF
mouse.position = (729,491)
mouse.click(Button.left,1)
time.sleep(4)

#klik Create PDF
mouse.position = (776,570)
mouse.click(Button.left,1)
time.sleep(4)

Я пытаюсь добавить это, чтобы доказать, что это не может получить доступ к этому раскрывающемуся элементу "tableau" Провинции, есть некоторый другой код перед этим, но цель состоит в том, чтобы активизировать этот код ниже, чтобы он мог обнаружить весь элемент провинции, который я нахожу в классе FIItem FISimpleDropdownItem, но он возвращает [* клавиатуры, но для выбора элемента с помощью «switch frame»:

#klik blok provinsi
mouse.position = (1143,322)
mouse.click(Button.left,1)
time.sleep(4)

wait = WebDriverWait(driver, 4)
frame = driver.find_element_by_class_name('tableauViz')
driver.switch_to.frame(frame)
driver.find_element_by_id("FI_sqlproxy.0m3kdgc0og85y318c97vy111o7p3,none:Nmprop:nk4537390993424018834_13946604467497001081_5").click()
driver.switch_to.default_content()
time.sleep(2)

#klik blok RS
mouse.position = (1134,369)
mouse.click(Button.left,1)
time.sleep(4)

driver.switch_to.frame(frame)
driver.find_element_by_id("FI_sqlproxy.0m3kdgc0og85y318c97vy111o7p3,none:Nmppk:nk4537390993424018834_13946604467497001081_3").click()
driver.switch_to.default_content()
time.sleep(2)

он работает и может загружаться с заданной провинцией и RUmah sakit (больница), и следующая задача для меня - перечислить все элементы в этих выпадающих меню, я пытаюсь использовать идею 'find_all (class _ = "randomname") ", что мне нужно добавить это в мой код:

page_source = driver.page_source
link_soup = bs4.BeautifulSoup(page_source,'html.parser')

, и я хочу проверить, если это Калифорния n перечислите все доступные элементы в выпадающих списках провинции по:

x = []
x = link_soup.find_all(class_='FIItem FISimpleDropdownItem')
print(x)

он не возвращает ошибок, но:

[]

что не так? Я имею в виду, я предполагаю, что я делаю правильные вещи, потому что я, наконец, могу выбирать элементы по элементам в обоих выпадающих меню, но когда я пытаюсь перечислить все доступные опции, для циклических нужд позже возвращается []. Можете ли вы дать мне совет? Спасибо.

Ну, наконец, моя программа запускается, и она может загружать файлы, выбирая первое выпадающее меню «Провинция», и для каждой провинции она загружает файл для каждой «Больницы», которая является 2-е выпадающее меню. Пожалуйста, проверьте этот код, он работает на моем P C, но я думаю, что вы, ребята, знаете, как его изменить.

import time, bs4, requests
from pynput.mouse import Button, Controller as mouseC
from pynput.keyboard import Key, Controller as keyC
from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
from selenium.webdriver.common.by import By

mouse, keyboard = mouseC(),keyC()

driver = webdriver.Chrome()
driver.get("https://bpjs-kesehatan.go.id/bpjs/")
driver.maximize_window()
wait = WebDriverWait(driver, 4)
element = driver.find_element_by_xpath("/html/body/section[2]/div")
element.location_once_scrolled_into_view
driver.execute_script("window.scrollTo(0, 500)")

#hilangkan window biru
time.sleep(4)
mouse.position = (1017,313)
mouse.click(Button.left,1)
time.sleep(4)

#klik Pembayaran klaim
mouse.position = (337,269)
mouse.click(Button.left,1)
time.sleep(4)

###########################################
provinsi = []
RS = []
frame = driver.find_element_by_class_name('tableauViz')
driver.switch_to.frame(frame)

#list provinsi
mouse.position = (1143,322)
mouse.click(Button.left,1)
time.sleep(2)

page_source = driver.page_source
link_soup = bs4.BeautifulSoup(page_source,'html.parser')

for e in link_soup.find_all(class_='FIItem FISimpleDropdownItem'):
    provinsi.append(e.text)
driver.switch_to.default_content()
time.sleep(2)
mouse.position = (1143,322)
mouse.click(Button.left,1)
time.sleep(2)

for i in range(len(provinsi)):
    mouse.position = (1143,322)
    mouse.click(Button.left,1)
    time.sleep(2)
    driver.switch_to.frame(frame)
    driver.find_element_by_id("FI_sqlproxy.0m3kdgc0og85y318c97vy111o7p3,none:Nmprop:n    k4537390993424018834_13946604467497001081_"+str(i)).click()
    driver.switch_to.default_content()
    time.sleep(5)

mouse.position = (1134,369)
mouse.click(Button.left,1)
time.sleep(2)
driver.switch_to.frame(frame)
for j in link_soup.find_all(class_='FIItem FISimpleDropdownItem'):
    RS.append(j.text)
driver.switch_to.default_content()
mouse.position = (1134,369)
mouse.click(Button.left,1)

#klik blok RS
for k in range(len(RS)):
    print(len(RS))
    mouse.position = (1134,369)
    mouse.click(Button.left,1)
    time.sleep(4)    
    driver.switch_to.frame(frame)
    driver.find_element_by_id("FI_sqlproxy.0m3kdgc0og85y318c97vy111o7p3,none:Nmppk:nk4537390993424018834_13946604467497001081_"+str(k)).click()
    driver.switch_to.default_content()
    time.sleep(10)

    #klik Download
    mouse.position = (1092,645)
    mouse.click(Button.left,1)
    time.sleep(4)

    #klik PDF
    mouse.position = (729,491)
    mouse.click(Button.left,1)
    time.sleep(4)

    #klik Create PDF
    mouse.position = (776,570)
    mouse.click(Button.left,1)
    time.sleep(10)

Резюме моего последнего кода, я объединяю их: 1. Выбор селена Элемент класса 2. просит bs4 перечислить все доступные провинции и больницы для каждого раскрывающегося списка, к которому я могу получить доступ, только если я сначала автоматически нажму на раскрывающиеся списки, используя «3-ю точку», которая является .. 3. событие мыши

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...