хитрый вопрос по селену и питону (найдите xpath, нажмите, вернитесь, нажмите «Далее» и загрузите больше) - PullRequest
0 голосов
/ 14 октября 2019

У меня есть хитрая работа, которую я не могу понять, ответ (ы) для!

Страница, с которой я пытаюсь получить данные, имеет несколько div, которыесодержит те же class, сложенные в списке, в котором я выполнил xpath, за которым следует click(), как описано ниже:

from selenium import webdriver
from webdriver_manager.chrome import ChromeDriverManager

driver = webdriver.Chrome(ChromeDriverManager().install())
driver.get('https://www.example.com/list')
driver.find_element_by_xpath("//*[text()='My pages']").click();

username = driver.find_element_by_name('email')
username.send_keys('email@email.com')

password = driver.find_element_by_id('password')
password.send_keys('password')
password.submit()

find = driver.find_element_by_xpath('//div[@class="card"]')
find.click()

Теперь, когда я на новой странице, мне удалосьзахватите детали, которые я хочу использовать:

def get_elements_by_xpath_text(driver, xpath):
    return [entry.text for entry in driver.find_elements_by_xpath(xpath)]
def get_elements_by_xpath_href(driver, xpath):
    return [entry.get_attribute("href") for entry in driver.find_elements_by_xpath(xpath)]

link_entries = [
    ("HREF", "//div[@class='col']//a[@rel]"),] 
text_entries = [
    ("FACT 1", "//div[@class='fact' and contains(span, '')][1]"),
    ("FACT 2", "//div[@class='fact' and contains(span, '')][2]"),
    ("FACT 3", "//div[@class='fact' and contains(span, '')][3]"),
    ("FACT 4", "//div[@class='fact' and contains(span, '')][4]"),
]
with open('list.csv', 'ab') as fd:
    csv_output = csv.writer(fd)
    csv_output.writerow([name for name, xpath in text_entries or link_entries])
    entries = []
    for name, xpath in text_entries:
        entries.append(get_elements_by_xpath_text(driver, xpath))
    for name, xpath in link_entries:
        entries.append(get_elements_by_xpath_href(driver, xpath)) 
    csv_output.writerows(zip(*entries))

Затем следует driver.back(), чтобы вернуться к ../list, где у меня начинает болеть голова ...

Проблема 1: Как мне заставить скрипт цикл этот процесс перейти к следующему //div[@class="card"]? Имейте в виду, что все div имеют одинаковые class! Я пытался использовать EC.element_to_be_clickable((By.ID, 'card'), но не получил его на работу ...

Проблема 2: Когда проблема 1 решена, возникает другая проблема, и это то, что отображаемый списокВ нижней части страницы есть функция «Загрузить больше»: Как заставить скрипт зацикливаться на Задаче 1, пока кнопка «Загрузить больше» и далее не зацикливаться на Задаче 1, пока не появится следующее «Загрузить еще» (и т. д. ...)?

Если у вас есть другие предложения или комментарии, не стесняйтесь спрашивать или дайте мне знать! Заранее спасибо

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