Попытка автоматического заполнения слайдера веб-формы с помощью Python - PullRequest
0 голосов
/ 15 июня 2019

Я новичок в Python, это моя первая попытка закончить программу моей собственной идеи.Пытаясь создать программу для автоматического заполнения веб-сайта с помощью Selenium, теперь я дошел до точки в форме, которая требует выбора годового дохода из скользящей шкалы.Как я могу использовать Selenium или другой модуль, чтобы переместить элемент в предопределенную позицию (значение в фунтах стерлингов)?

Предпочтительно случайное значение, скажем, от 20 000 до 30 000 фунтов стерлингов, например

enter image description here

Я пробовал поискать в Google, но не повезло.Также другие подобные вопросы о переполнении стека - ответы содержат комментарии о том, что они не работают.Я попробовал несколько и не могу заставить их работать самостоятельно.

Ниже приведен код, который я сейчас использую

percent = 50

browser.switch_to_frame(0)
browser.switch_to_active_element()

slidebar = browser.find_element_by_xpath('//*[@id="annualRangeWrap"]/a')
height = slidebar.size['50']
width = slidebar.size['342']

move = ActionChains(driver); 

slider = browser.find_element_by_xpath('//*[@id="annualRangeWrap"]/a')

if width > height:

    move.click_and_hold(slider).move_by_offset(percent * width / 100, 0).release().perform()
else:

    move.click_and_hold(slider).move_by_offset(percent * height / 100, 0).release().perform()

browser.switch_to_default_content()

Это код из элемента inspect

<div class="question" id="annualRangeWrap" style="display: block;"><div class="rangeLabel">Annual income</div>

<div class="rangeWrap"><div class="rangeLow">£0</div><div class="rangeNum"><span>Slide to select</span></div>
<div class="rangeHigh">£50,001+</div>
<div class="affRangeSlider ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all">
<div class="ui-slider-range ui-widget-header ui-slider-range-min" style="width: 0%;"></div>
<a class="ui-slider-handle ui-state-default ui-corner-all" href="#" style="left: 0%;"></a></div></div></div>
''<div class="rangeLabel">Annual income</div><div class="rangeWrap"><div class="rangeLow">£0</div><div class="rangeNum">
<span>Slide to select</span></div><div class="rangeHigh">£50,001+</div>
<div class="affRangeSlider ui-slider ui-slider-horizontal ui-widget ui-widget-content ui-corner-all">
<div class="ui-slider-range ui-widget-header ui-slider-range-min" style="width: 0%;"></div>
<a class="ui-slider-handle ui-state-default ui-corner-all" href="#" style="left: 0%;"></a></div></div>'

Я пытался использовать ID, класс, Xpath.Я не могу понять, где я иду не так

Это обычно то, что я получаю при трассировке.Я пытался использовать разные элементы в комбо, но всегда "не могу найти" ххххх ""

File "C:\Users\John\Desktop\New folder (2)\VeryAutoForm.py", line 138, in <module>
    slidebar = browser.find_element_by_xpath('//*[@id="annualRangeWrap"]/a')
  File "C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 394, in find_element_by_xpath
    return self.find_element(by=By.XPATH, value=xpath)
  File "C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 978, in find_element
    'value': value})['value']
  File "C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\webdriver.py", line 321, in execute
    self.error_handler.check_response(response)
  File "C:\Program Files\Python37\lib\site-packages\selenium\webdriver\remote\errorhandler.py", line 242, in check_response
    raise exception_class(message, screen, stacktrace)
selenium.common.exceptions.NoSuchElementException: Message: no such element: Unable to locate element: {"method":"xpath","selector":"//*[@id="annualRangeWrap"]/a"}

1 Ответ

0 голосов
/ 07 июля 2019

Хорошо, я нашел решение.Может быть очевидным для любого, кто знает CSS, но я все еще новичок.Код, который работал для меня, был очень прост.Конечно, измените селектор CSS, чтобы он соответствовал вашему.Я добавил, что процент для моего решения, скорее всего, будет другим

from selenium.webdriver.common.action_chains import ActionChains
percent = random.randint(150, 340)

slider = browser.find_element_by_css_selector("#totalRangeWrap > div:nth-child(2) > div:nth-child(4) > a:nth-child(2)")

move = ActionChains(browser)
move.click_and_hold(slider).move_by_offset(percent, 0).release().perform()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...