Как использовать WebDriverWait с переменной str By.XPATH

Мне трудно найти, как реализовать неявное ожидание, когда у меня есть строковая переменная в xpath.

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

try:
    link = driver.find_element_by_xpath("//tr[@data-recordindex = '"+str(i)+"']//img[contains(@class,'x-tree-expander')]")
    datarow = driver.find_element_by_xpath("//tr[@data-recordindex = '"+str(i)+"']")
    print("Level: " +str(level)+ ": " +datarow.text)
    link.click()
except NoSuchElementException:
    not_a_point = False

Я пробовал это, и он не ждал, просто переходил по следующей ссылке, а не по той, которую я жду появления. Полагаю, я не могу просто поместить в By.XPATH то же самое, что и find_element_by_xpath().

try:
    link = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.XPATH, "//tr[@data-recordindex = '"+str(i)+"']//img[contains(@class,'x-tree-expander')]")))
    datarow = driver.find_element_by_xpath("//tr[@data-recordindex = '"+str(i)+"']")
    print("Level: " +str(level)+ ": " +datarow.text)
    link.click()
except NoSuchElementException:
    not_a_point = False

person David Emmerich    schedule 25.09.2020    source источник
comment
обход дерева XPATH немного неинтуитивен ... ваша вторая часть // img [contains (@ class, 'x-tree-expander') будет искать всю DOM, а не дочерние элементы первой части пути ... Я бы посоветовал использовать более конкретный XPATH, если можете. Классы стилей обычно недостаточно конкретны.   -  person pcalkins    schedule 25.09.2020
comment
Какую ошибку вы получаете? str (i) - буква i начинается с 0 или 1?   -  person Sureshmani Kalirajan    schedule 25.09.2020


Ответы (1)


Вам нужно позаботиться о нескольких вещах, а именно:

  • ImplicitWait не так эффективен при работе с динамическими элементами / веб-сайтами и вам нужно вызвать WebDriverWait.
  • 10 секунд или 6 секунд промежуток времени для Явное ожидание должно быть реализовано в соответствии с документацией по дизайну теста.
  • As I answered to your previous question to locate the element you need to induce WebDriverWait for the visibility_of_element_located() and you can use the following Locator Strategy:
    • Использование переменной:

      link = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//tr[@data-recordindex = '" + str(i) + "']//img[contains(@class,'x-tree-expander')]")))
      
    • Использование %s:

      link = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//tr[@data-recordindex = '%s']//img[contains(@class,'x-tree-expander')]"% str(i))))
      
    • Использование {}:

      link = WebDriverWait(driver, 20).until(EC.visibility_of_element_located((By.XPATH, "//tr[@data-recordindex = '{}']//img[contains(@class,'x-tree-expander')]".format(str(i)))))
      

использованная литература

Вы можете найти несколько соответствующих подробных обсуждений того, как работать с переменными в xpath в:

person DebanjanB    schedule 25.09.2020