Используйте переменную, чтобы найти, что xpath selenium не работает

#python #selenium #xpath

Вопрос:

Я работаю над веб-автоматизацией с помощью selenium, и мне нужно найти элемент с xpath. Это само по себе не проблема, но код должен выполняться несколько раз, и когда он это делает, HTML xpath изменяется. Это тоже не проблема. Я использовал простую математику, чтобы каждый раз получать новый xpath.

Xpathes выглядят так

 1. run: '//*[@id="input-text-3"]'
2. run: '//*[@id="input-text-5"]'
3. run: '//*[@id="input-text-7"]' etc.
 

Я решил эту проблему с помощью этого кода:

 y = 1
#Corme browser already defined and on website 
while True:
    mathop1 = y*2   1
    xxpath = ""'//*[@id="input-text-'   str(mathop1)   '"]'""
    xxpath1 = "'"   str(xxpath)   "'"
    print(xxpath1)    
    Bezeichnung = driver.find_element_by_xpath(xxpath1)
    Bezeichnung.send_keys(file1name)
    y = y   1
 

Это приводит к тому, что каждый раз, когда программа зацикливается, она обновляет y, чтобы xpath был правильным. Я попытался использовать вывод xxpath1, чтобы найти элемент, как обычно, и он работает нормально, однако, как только я использую переменную, он не работает. В частности, проблема в том, что я не могу использовать переменную.

 Bezeichnung = driver.find_element_by_xpath(xxpath1)
 

почему это не работает?

Комментарии:

1. «Я не могу использовать эту переменную» — что именно вы имеете в виду? Вы получаете какую-то ошибку?

2. да, я получаю ошибку, но переменная определена

3. О чем говорит ошибка?

4. Я получаю эту ошибку конкретно : Файл «c:/Users/bodig/Desktop/Advanced адло builder.py», строка 303, в <модуле> Bezeichnung = driver.find_element_by_xpath(xxpath1)

5. Также это: Ошибка типа: Не удалось выполнить «оценку» для «Документа»: Результат не является набором узлов и, следовательно, не может быть преобразован в нужный тип.

Ответ №1:

Прежде всего, я думаю, вы должны поставить там условие ожидания.
Кроме того, я не понимаю, почему вы используете так много строк внутри строки и снова преобразуете строку в строку, поэтому я удалил это

 y = 1
#Corme browser already defined and on website 
while True:
    mathop1 = y*2   1
    xxpath = '//*[@id="input-text-{}"]'.format(mathop1)
    Bezeichnung = WebDriverWait(driver, 20).until(EC.element_to_be_clickable((By.XPATH, xxpath)))
    Bezeichnung.send_keys(file1name)
    y = y   1
 

Комментарии:

1. Я попробовал код, но он все еще не работает. Теперь он выдает мне эту ошибку: ine 301, в <модуле> Bezeichnung = WebDriverWait(драйвер, 20).до(EC.element_to_be_clickable((По.XPATH, «xxpath»)))

2. Какая ошибка? тайм-аут? или элемент не найден?

3. Тайм-аут Я думаю, что это то, что там написано: строка 80, до тех пор, пока не возникнет исключение TimeoutException(сообщение, экран, трассировка стека) selenium.common.исключения. Исключение TimeoutException: Сообщение:

4. Кажется, что xpath выражение не совсем правильное. Я думаю, там ничего iframe нет? Так как это также может быть проблемой.

5. Я не совсем понимаю? Что вы подразумеваете под IFrame?