Как ждать комбинации CSS и селектора XPath в Python WebDriver? - PullRequest
0 голосов
/ 30 октября 2018

Я бы хотел, чтобы мои селекторы были простыми, когда это возможно, и используйте XPath только в случае крайней необходимости. Поэтому вместо ожидания XPath, подобного //*[@class='files']/tbody/tr[1]/th[text()='filename'], я бы предпочел дождаться комбинации простого селектора CSS .files tbody tr:first-child и простого XPath th[text()='filename'].

presence_of_element_located принимает только один локатор, поэтому presence_of_element_located((By.CSS_SELECTOR, '.files tbody tr:first-child'), (By.XPATH, 'th[text()='filename']')) отсутствует.

Я тоже не могу связать эти функции, поэтому presence_of_element_located((By.CSS_SELECTOR, '.files tbody tr:first-child')).presence_of_element_located((By.XPATH, 'th[text()='filename']')) не будет работать.

1 Ответ

0 голосов
/ 30 октября 2018

Вы можете создать свой собственный метод:

def find_element_by_combo(self, ancestor_locator, descendant_locator, timeout=10, index=0):
    # Getting list of ancestors
    try:
        ancestors =  wait(self, timeout).until(EC.presence_of_all_elements_located(ancestor_locator))
    except:
        return None
    # Getting descendant
    for ancestor in ancestors:
        if ancestor.find_elements(*descendant_locator):
            return ancestor.find_elements(*descendant_locator)[index]

и используйте его, как показано ниже

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

Chrome.find_element_by_combo = find_element_by_combo

driver = Chrome()
driver.get(URL)
driver.find_element_by_combo(('css', '.files tbody tr:first-child'), ('xpath', './th[text()="filename"]'))

Но ИМХО лучше использовать XPath для сложных ситуаций

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