Коротко — через XPath + функция translate(), либо получить элементы и отфильтровать в Python/JS. В XPath нет lower() (в 1.0), поэтому нужно вручную сопоставить верхний/нижний регистр символов.
1) Пример для поиска по тексту ссылки (partial link text), нечувствительно к регистру:
Python / Selenium 4:
from selenium.webdriver.common.by import By
target = "искать" # строка в любом регистре, лучше привести к lower() заранее
# переводим текст узла в нижний регистр через translate()
xpath = (
"//a[contains(translate(normalize-space(.), "
"'ABCDEFGHIJKLMNOPQRSTUVWXYZАБВГДЕЁЖЗИЙКЛМНОПРСТУФХЦЧШЩЪЫЬЭЮЯ',"
"'abcdefghijklmnopqrstuvwxyzабвгдеёжзийклмнопрстуфхцчшщъыьэюя'), "
f"'{target.lower()}')]"
)
elem = driver.find_element(By.XPATH, xpath)
Обратите внимание: в translate() нужно перечислить все символы, которые вы хотите "понизить" — в примере включены латиница и русская кириллица (вместе с Ё/ё).
2) По атрибуту name (точное или частичное совпадение), нечувствительно к регистру:
# точное совпадение
name_val = "MyName"
xpath_exact = (
f"//*[@name and translate(@name, "
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz') = '{name_val.lower()}']"
)
elem = driver.find_element(By.XPATH, xpath_exact)
# частичное совпадение
partial = "часть"
xpath_contains = (
f"//*[@name and contains(translate(@name, "
"'ABCDEFGHIJKLMNOPQRSTUVWXYZ', 'abcdefghijklmnopqrstuvwxyz'), '{partial.lower()}')]"
)
elem = driver.find_element(By.XPATH, xpath_contains)
3) Альтернативы:
- Если хочется проще (и не хочется писать длинную translate для кириллицы), можно взять все элементы и отфильтровать в Python:
elems = driver.find_elements(By.TAG_NAME, "a")
elem = next((e for e in elems if partial.lower() in e.text.strip().lower()), None)
- Или отфильтровать в браузере через JS (быстро и гибко для Unicode):
js = """
return Array.from(document.querySelectorAll('a'))
.find(a => a.textContent && a.textContent.trim().toLowerCase().includes(arguments[0].toLowerCase()));
"""
elem = driver.execute_script(js, partial)
Замечания:
- XPath-translate работает посимвольно — если ваша страница содержит другие алфавиты (греческий, турецкий и т.д.), их тоже надо добавить в mapping.
- При использовании строк с одиночными кавычками в XPath аккуратно экранируйте/меняйте кавычки (либо используйте concat()).
Если скажете, для какого языка/алфавита у вас реальные варианты ссылок (например только латиница или русская кириллица), могу дать готовую точную строку translate().