LINUX.ORG.RU

Не могу замаскировать символ '

 , ,


1

1

Как замаскировать этот символ?

driver.find_elements_by_xpath("//*[contains(text(), 'Ne\'xt')]")[0].click()

Выдаёт

selenium.common.exceptions.InvalidSelectorException: Message: Given xpath expression "//*[contains(text(), 'Ne'xt')]" is invalid: SyntaxError: The expression is not a legal expression.

Ответ на: комментарий от MyTrooName
selenium.common.exceptions.InvalidSelectorException: Message: Given xpath expression "//*[contains(text(), 'I''m in')]" is invalid: SyntaxError: The expression is not a legal expression
steemandlinux ★★★★★
() автор топика
Ответ на: комментарий от Deleted

А как оно понимает, что quote это кавычки, а %27 это просто часть текста? Почему классический \ не помогает?

steemandlinux ★★★★★
() автор топика

А подумать?

>>> print("//*[contains(text(), 'Ne\'xt')]")
//*[contains(text(), 'Ne'xt')]
>>> print("//*[contains(text(), 'Ne\\'xt')]")
//*[contains(text(), 'Ne\'xt')]

или

>>> print("//*[contains(text(), \"Ne'xt\")]")
//*[contains(text(), "Ne'xt")]

slovazap ★★★★★
()
Ответ на: комментарий от steemandlinux

Классический \ в xpath 1.0 не работает. Отсюда и проблемы. Единственный способ «экранирования» - использовать два вида кавычек.

Такой вот «гибкий» xpath, да.

Deleted
()
Ответ на: комментарий от steemandlinux

Хвататься в xpath за text() - сомнительная затея, если тот не нормализирован в понятном для парсера виде.

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

r'''//*[contains(text(), "Ne'xt") or contains(text(), "Ne%27xt") or contains(text(), "Ne`xt" и т.д.) ]'''

P.S. Отсутствие формализации таких случаев и приводит к тому, что подчас html проще парсить регулярками, чем xpath\csspath.

Deleted
()
Последнее исправление: Rainor (всего исправлений: 2)
Ответ на: комментарий от steemandlinux

Зависит от того, что у вас там за страница.

Если генерируются class\id, которые генерируются очевидным образом, то можно попытать счастья с css wildcards. Что-то в духе:

*[id^="start_with"][id$="ends_with"]

Но в селениуме я такое сам не использовал. Знаю лишь, что теоретически такое взлетает.

Deleted
()
Ответ на: комментарий от Deleted

Реально придется парсить, оказывается selenium однопоточный, пытался запилить параллельный if elif, чтобы не ожидать implicitly_wait, а он не запускает find_element, пока не закончится предыдущий поток.

import threading
import time
from polling import poll
from selenium import common
from selenium import webdriver

class Test(object):
    def __init__(self):
        self.driver = None
        self.element = None
        
    def start_init(self):
        binary = FirefoxBinary('/usr/bin/firefox-esr')
        self.driver = webdriver.Firefox(firefox_binary=binary)
        self.driver.implicitly_wait(30)
        self.driver.maximize_window()
        
    def myel(self):
        return self.element

class TestThread(object):
    def __init__(self, test, target):
        self.target = target
        
    def wiki(self):
        try:
            print("Enter the function")
            self.target()
            print("Element Found")
            test.element = True
        except common.exceptions.NoSuchElementException:
            pass

        
test = Test()
test.start_init()
test.driver.get("https://en.wikipedia.org/wiki/Selenium_(software)")


dthread = TestThread(test, lambda: test.driver.find_element_by_xpath("//*[contains(text(), 'His1tory')]"))
thread = threading.Thread(target=dthread.wiki)
thread.start()

dthread = TestThread(test, lambda: test.driver.find_element_by_xpath("//*[contains(text(), 'History')]"))
thread = threading.Thread(target=dthread.wiki)
thread.start()

poll(lambda: test.myel() == True, step=0.5, timeout=40)
print("Happy End")
steemandlinux ★★★★★
() автор топика
Вы не можете добавлять комментарии в эту тему. Тема перемещена в архив.