селен содержит текст, который не может найти элемент в диалоговом окне - PullRequest
0 голосов
/ 13 марта 2019

Мне нужно было удалить сайт, содержащий список. Нажатие любого элемента списка показывает модальное диалоговое окно, которое содержит некоторый текст, который я хочу удалить. Выполнение этого в цикле приводит к исключению устаревших элементов, поэтому это то, что я делал изначально

elems = browser.find_elements_by_xpath("//a[@data-toggle='modal']")
temp_names = []
for elem in elems:
    temp_names.append(elem.text)

где щелчок по этому элементу тега привязки показывает модальное диалоговое окно, поэтому я сохранил текст всех этих элементов в списке и, наконец, сделал это:

for temp_name in temp_names:
    print(temp_name)
    modals= browser.find_element_by_xpath("//a[contains(text(),'"+temp_name+"')]")
    modals.click()
    time.sleep(1)
    # rest of the scrapping code

Теперь я получаю сообщение об ошибке исключения элемента, хотя temp_name печатает правильный текст. Структура веб-страницы следующая:

<div class="...">
    <h4 class="...">
        <a href=# data-toggle="modal" data-target="#(target modal dialogue id)">Text</a>
    </h4>
    .   .   .
    (Some Other tags)
    .   .   .
</div>
<div id =(modal dialogue id) class="..." role="dialog">
    .   .   .
    (Some text I want to Scrap)
    .   .   .    
</div>

Я ищу текст в теге привязки. Я планирую найти элемент по тексту, а затем щелкнуть его, а затем вернуться к исходному URL-адресу, используя browser.get (URL) в конце цикла, и снова найти второй элемент и так далее. Я не понимаю, почему он не может найти элемент, так как я только что получил текст элемента в предыдущем цикле. Также, если есть лучший способ сделать это, пожалуйста, поделитесь.

Примечание: Я не могу очистить непосредственно из модального диалогового окна div, если не нажму сначала, иначе возвращаемый текст будет пустым.

Edit:

Ниже приведен мой текущий код:

chromedriver = 'C:\\chromedriver.exe'
chop = webdriver.ChromeOptions()
chop.add_extension('C:\\AdBlock_v3.38.1.crx')
time.sleep(5)
browser = webdriver.Chrome(chromedriver, chrome_options = chop)


for i in range(1,22):
    browser.get("http://pasha.org.pk/members/page/"+str(i)+"/")
    time.sleep(1)
    elems = browser.find_elements_by_xpath("//a[@data-toggle='modal']")
    print(len(elems))
    temp_names = []
    for elem in elems:
        temp_names.append(elem.text)
    current = browser.current_url
    for temp_name in temp_names:
        print()
        print(temp_name)
        print()
        modals= browser.find_element_by_xpath(f"//a[contains(text(), '{temp_name}')]")
        modals.click()
        time.sleep(1)
        # elem2 = browser.find_element_by_xpath("//button[@class='close']")
        # time.sleep(1)
        browser.get(current)

Ниже приведен фрагмент ошибки, которую я получаю:

Ошибка при выполнении кода

1 Ответ

0 голосов
/ 14 марта 2019

Пара вещей, которые вы можете попробовать - я думаю, что ваши цитаты могут немного испортить синтаксис, но если это проблема, я не уверен, почему это сработает для первого цикла ....

modals= browser.find_element_by_xpath(f"//a[contains(text(), '{temp_name}')]")

modals= browser.find_element_by_xpath("//a[contains(text(), '" + temp_name + "')]")

Работает ли какое-либо из этих определений лучше?

Если нет, можете ли вы загрузить полный текст ошибки, который вы получаете?

Изменить для уточнения пояснения OP: "Iнужно щелкнуть все теги с data-toggle = 'modal' "

Для меня следующий xPath возвращает 20 <a> элементов с data-toggle='modal'

modals= browser.find_element_by_xpath("//a[@data-toggle='modal']")
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...