Как мне найти правильный способ найти нужный элемент с помощью Selenium в Python? - PullRequest
1 голос
/ 02 апреля 2020

Цель:

<li><a href="javascript:void(0);" ng-click="vm.exportData('csv')"><i class="fa fa-file-text"></i> csv</a></li>

, которая находится в

<ul class="dropdown-menu">
    <li><a href="javascript:void(0);" ng-click="vm.exportData('excel')"><i class="fa fa-file-excel-o"></i> excel</a></li>
    <li><a href="javascript:void(0);" ng-click="vm.exportData('pdf')"><i class="fa fa-file-pdf-o"></i> pdf</a></li>
    <li><a href="javascript:void(0);" ng-click="vm.exportData('csv')"><i class="fa fa-file-text"></i> csv</a></li>
</ul>

В консоли код JS работает плавно:

document.getElementsByClassName('dropdown-menu')[1].getElementsByTagName('a')[2].click();

Код, который я написал:

LINK = "http://e-licitatie.ro/pub/notices/contract-award-notices/list/3/1"
PATH = "/Users/ultiplex/Documents/WORKSPACE/insightout/chromedriver"
DRIVER = webdriver.Chrome(PATH)
DELAY = 30

def wait(delay: int, xpath: str) -> None: 
    try:
        WebDriverWait(DRIVER, delay).until(EC.invisibility_of_element_located((By.XPATH, "//div[@class='block-ui-overlay']")))
        print('Overlay bypassed')
        WebDriverWait(DRIVER, delay).until(EC.presence_of_element_located((By.XPATH, xpath)))
        print(f"Element {xpath} found")
    except: 
        print("Error")

def load_link(link: str) -> None: 
    DRIVER.get(LINK)
    print("Link loaded")    

def click(xpath: str, delay: int) -> None: 
    wait(delay, xpath)
    DRIVER.find_element_by_xpath(xpath).click()
    print("Clicked")

def filter(fr_date: str, to_date: str) -> None: 
    DRIVER.find_element_by_xpath("//input[@placeholder='De la data']").send_keys(fr_date)
    DRIVER.find_element_by_xpath("//input[@placeholder='Pana la data']").send_keys(to_date)
    print("Filter selected")

if __name__ == "__main__":
    load_link(LINK)
    click("//button[@class='pull-right btn btn-default']", DELAY)
    filter("31/03/2020", "01/04/2020")
    click("//button[@class='pull-right margin-left-5 btn btn-entity']", DELAY)

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

Пожалуйста, поддержите.

Ответы [ 2 ]

0 голосов
/ 02 апреля 2020

Вам нужно сначала нажать на ссылку экспорта, чтобы увидеть элемент списка, затем вы можете нажать на ссылку CSV. Добавьте две строки после нажатия на поиск.

#Click on Export link
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//a[@class='darkorange dropdown-toggle' and contains(.,'Export')]"))).click()
#Click on csv link
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//ul[@class='dropdown-menu']//li//a[contains(.,'csv')]"))).click()

Полный блок кода.

from selenium import webdriver
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.common.by import By
from selenium.webdriver.support import expected_conditions as EC

driver=webdriver.Chrome()
driver.get("http://e-licitatie.ro/pub/notices/contract-award-notices/list/3/1")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//button[@class='pull-right btn btn-default']"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//input[@placeholder='De la data']"))).send_keys("31/03/2020")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//input[@placeholder='Pana la data']"))).send_keys("01/04/2020")
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//button[@class='pull-right margin-left-5 btn btn-entity']"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//a[@class='darkorange dropdown-toggle' and contains(.,'Export')]"))).click()
WebDriverWait(driver,10).until(EC.element_to_be_clickable((By.XPATH,"//ul[@class='dropdown-menu']//li//a[contains(.,'csv')]"))).click()
0 голосов
/ 02 апреля 2020

Попробуйте следующий xpath.

(//ul[@class='dropdown-menu'][2]//a)[3]

enter image description here

Или

//ul[@class='dropdown-menu'][2]//a[normalize-space(.)='csv']

enter image description here

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