Я пытаюсь использовать Python и Selenium, чтобы щелкнуть ползунок/флажок на веб-сайте, и у меня возникают большие трудности. Я могу просто найти элемент по идентификатору (1369) и щелкнуть по нему, не беспокоясь, за исключением того, что идентификационные номера динамически меняются со временем, поэтому они оказываются для меня практически бесполезными.
Я также пытался найти элемент по классу, XPath и т. д. и щелкнуть по нему, используя множество вопросов, опубликованных в Stack Overflow в качестве ссылки, но безуспешно, поскольку, похоже, в моем сценарии есть некоторые различия в HTML-коде, которые мешают мне прогрессировать. . Любая помощь будет очень признательна, спасибо!
Ссылайтесь на HTML как на текст:
<div class = "f-box vcbox">
<span class = "text-item box-item">Single date</span>
<div id = "1369" class = "checkbox checbox-switch switch-primary ">
<label>
<em class = "fake-input "></em>
<span>
::before
</span>
</label>
</div>
Код, который работает, когда идентификатор известен заранее:
driver.find_element(By.ID, "1369").click()
Код, который не сработал:
driver.find_element(By.CSS_SELECTOR, 'em.checkbox checbox-switch switch-primary').click()
driver.find_element(By.CSS_SELECTOR, 'div.checkbox.checbox-switch.switch-primary').click()
driver.find_element(By.XPATH, "//span[contains(.,'Single date')]").click()
Скриншоты пользовательского интерфейса — это здорово, скриншоты кода или HTML — нет. Пожалуйста, прочтите, почему скриншот кода/HTML — плохая идея. Отредактируйте свой вопрос и добавьте код/HTML в виде текста в правильном формате. Кроме того, в таких случаях очень поможет ссылка на страницу.
@ мне после того, как вы обновили свой вопрос, указав HTML в виде текста. У меня есть ответ, но я хочу сначала его проверить.
Всем привет. Спасибо за ваш вклад. Я обновил свой пост, включив в него то, о чем вы просили. Если есть что-то, что можно улучшить с моей стороны, дайте мне знать, и я буду рад отредактировать снова по мере необходимости.
@JeffC рад опробовать любые предложения, спасибо, но для веб-сайта требуется вход в систему, который я не могу предоставить другим, чтобы они могли попробовать протестировать, извини, приятель.
@Benny88 Benny88 Вот почему я запрашиваю соответствующий HTML в виде текста. У меня на рабочем столе есть фиктивный HTML-файл, в который я могу вставить ваш HTML-код, открыть эту страницу в браузере и затем протестировать локаторы. Хотя во многих случаях URL-адрес лучше из-за времени и других проблем, это, по крайней мере, достойная замена.
@JeffC имеет смысл. Если я буду публиковать еще вопросы в будущем, я обязательно структурирую их таким образом.
Вам необходимо убедиться, что вы указываете правильные имена классов. Кажется, в имени вашего класса «checkbox-switch» допущена опечатка. Это должен быть «переключатель флажка». Кроме того, элемент не является дочерним элементом флажка класса with, поэтому ваш селектор CSS не будет работать. Вы можете попробовать что-то вроде этого:
driver.find_element(By.CSS_SELECTOR, 'div.checkbox.checkbox-switch.switch-primary').click()
Для подхода XPath вы можете попробовать следующее:
driver.find_element(By.XPATH, "//div[contains(@class, 'checkbox') and contains(@class, 'checkbox-switch') and contains(@class, 'switch-primary')]").click()
это должно работать.
Если вы посмотрите на фактический HTML-код, который был опубликован в вопросе... слово «флажок» на самом деле написано неправильно. Ни один из этих локаторов не будет работать.
Учитывая HTML
<span class = "text-item box-item">Single date</span>
<div id = "1369" class = "checkbox checbox-switch switch-primary ">
Рядом с нами есть элемент, который можно однозначно идентифицировать по содержащемуся в нем тексту,
<span class = "text-item box-item">Single date</span>
использование и XPath
(By.XPATH, "//span[text()='Single date']")
Отсюда мы можем найти DIV прямо под ним, используя following-sibling
,
(By.XPATH, "//span[text()='Single date']/following-sibling::div[1]")
Я также попытался найти элемент по классу/xpath. Это должно работать с правильным выражением xpath. Покажите нам, что вы пробовали.