найти и щелкнуть элемент с изменяющимся селектором CSS (python) - PullRequest
2 голосов
/ 02 мая 2019

Я пишу скрипт, который должен щелкнуть по элементу страницы, однако CSS-селектор меняется каждый день, когда элемент меняет свое местоположение.

Сегодня он называется:

PPTAmFCTable > tbody:nth-child(1) > tr:nth-child(11) > td:nth-child(3) > a:nth-child(1)

Вчера это было:

PPTAmFCTable > tbody:nth-child(1) > tr:nth-child(10) > td:nth-child(3) > a:nth-child(1)

А завтра это может быть tr:nth-child(13) или около того.

Я использую следующий код:

def click_element_bycss(browser,css,timeout):
    element_present = EC.presence_of_element_located((By.CSS_SELECTOR,css)) 
    WebDriverWait(browser, timeout).until(element_present)
    browser.find_element_by_css_selector(css).click()

, а затем:

click_element_bycss(browser,"#PPTAmFCTable > tbody:nth-child(1) > tr:nth-child(11) > td:nth-child(3) > a:nth-child(1)",4)

Как мне написать код так, чтобы я щелкнул по правому элементу, не зная числа во втором tr: nth-child ()?

ЭлементHTML:

<a href="/FC1/ItemList;jsessionid=E6B3D538CD809FDDC3DE69EA160C956D?WorkPool=PickingNotYetPicked&amp;ExSDRange.RangeEndMillis=1556850660000&amp;ProcessPath=PPTAmFC&amp;ExSDRange.RangeStartMillis=1556850599999&amp;shipmentType=TRANSSHIPMENTS">261</a>

Мысль о цикле, который просто проходит для i в диапазоне (1,20): tr: nth-child (i), но ожидал бы, что что-то умнее.

1 Ответ

3 голосов
/ 02 мая 2019

Чтобы найти элемент и щелкнуть по нему, поскольку этот элемент является динамическим, вам нужно вызвать WebDriverWait для element_to_be_clickable(), и вы можете использовать одну из следующих Стратегий локатора :

  • Использование CSS_SELECTOR:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.CSS_SELECTOR, "#PPTAmFCTable>tbody a[href^='/FC1/ItemList'][href$='TRANSSHIPMENTS']"))).click()
    
  • Использование XPATH:

    WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, "//*[@id='PPTAmFCTable' and starts-with(@href,'/FC1/ItemList')][contains(@href, 'TRANSSHIPMENTS')]")))
    
  • Примечание : необходимо добавить следующие операции импорта:

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