У меня возникают проблемы с автоматизацией повторяющихся задач на веб-сайте моей компании во внутренней сети.
Хотя я могу правильно находить элементы на других веб-сайтах (щелкать, отправлять ключи и т. д.), Я не могу делать то же самое на этом веб-сайте (я всегда получаю ошибку «невозможно найти элемент с помощью xpath == ...»).
Я попытался записать их те же задачи с помощью Selenium IDE, и он работает хорошо.
Если я экспортирую тестовый пример Selenium IDE как код python и сравниваю команду xpath с моей, xpath будет таким же, и это то же самое, что я получаю с помощью селектора firefox до точки, которую я хочу щелкнуть.
Поскольку по другим причинам я должен работать с проводником (у меня есть веб-драйвер проводника и т. д.), Я не пробовал запускать код с помощью python + (веб-драйвер для Firefox).
Код:
from selenium import webdriver
import time
driver=webdriver.IE("D:\myfolder\IEDriverServer.exe")
driver.implicitly_wait(30)
base_url = "https://companywebsite.ext")
driver.get(base_url) #it's ok until now, I can open the webpage
time.sleep(20)
element=driver.find_element_by_xpath("/html/body/div[2]/div/table/tbody/tr[3]")
time.sleep(10)
Вот мои вопросы:
1) Почему я могу делать что-то правильно на других сайтах, а не на этом?
2) Почему Selenium IDE может это делать и с теми же командами не работает с моим скриптом Python?
3) Нужно ли мне делать определенные настройки?
Большое тебе спасибо.
Спасибо, Моше. Я думаю, что это написано не на Angular, потому что, если я ищу элементы angular в консоли браузера, я ничего не могу найти.
вы пробовали использовать драйвер IE для других сайтов?
Да, и работает хорошо. Я пробовал в Facebook, Linkedin и т. Д .: мне удалось щелкнуть ссылки или отправить ключи к формам. Вы хоть представляете, в чем может быть проблема?
Если я хочу подождать, что что-то произойдет на странице, как вы предлагали говорить об элементах angular, какие команды мне следует использовать? Достаточно ли для этого общей команды time.sleep?
более элегантный способ (лучшая практика) - использовать wait, вот документация: selenium-python.readthedocs.io/waits.html
в вашем xPath вы должны использовать более надежный путь, такой как селекторы id или CSS.
вы решили эту проблему? вы видели данные ответы?






Вам следует попробовать использовать wait:
from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
driver=webdriver.IE("D:\myfolder\IEDriverServer.exe")
driver.implicitly_wait(30)
base_url = "https://companywebsite.ext")
driver.get(base_url)
wait = WebDriverWait(driver, 10)
element = wait.until(EC.visibility_of_element_located((By.XPATH, "/html/body/div[2]/div/table/tbody/tr[3]")))
Надеюсь это поможет!
Спасибо, правда, за помощь. Теперь трассировка изменилась в TimeoutException, как будто у него все еще есть проблемы с поиском элемента. Странно то, что selenium ide работает, и если вы экспортируете его как код Python, xpath будет таким же! Кстати, могу добавить инфу: на странице есть таблица, в которой строки соответствуют разным профилям; в HTML я нашел несколько команд «onclick»: они по одной для каждого профиля и выглядят как <tr onclick='document.forms.namedItem("a1").submit()'>. Как вы думаете, это может быть полезно для имитации щелчка мышью по одной из них?
да! можно добавить driver.execute_script("your JS to simulate clicking")
В этом случае я должен попробовать что-нибудь вроде: driver.execute_script("document.forms.namedItem("a1").submit()")? Спасибо!
это должно работать! вы можете просто щелкать элементы, которые нужно щелкнуть ... селеном!
Большое спасибо, Моше. Я пробовал целый день, но все равно не работает. Кажется, что на этой странице что-то зашифровано, я не знаю: я не могу найти ничего с обычными командами. Более того, единственная команда onclick, которую я могу активировать, - это ссылка на домашнюю страницу ... Я слишком неопытен в js, может быть ... или, может быть, что-то скрыто.
Сайт вашей компании написан на Angular? если это так, вы должны попробовать использовать wait for elements