首页 > 解决方案 > 尝试使用 python 自动完成 Web 表单滑块

问题描述

我是 Python 的初学者,这是我第一次尝试自己想法的完整程序。到目前为止,我试图制作一个使用 Selenium 自动填充网站的程序,现在我已经在表格中达到了需要从滑动比例元素中选择年收入的一点。如何使用 Selenium 或其他模块将元素滑动到预定义的位置(£值)?

例如,最好是介于 20,000 英镑和 30,000 英镑之间的随机值

在此处输入图像描述

我试过谷歌搜索,但没有运气。还有其他关于堆栈溢出的类似问题 - 答案有评论说它们不起作用。我已经尝试了一些,但无法让它们自己工作。

以下是我目前正在使用的代码

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()

这是检查元素的代码

<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。我无法弄清楚我哪里出错了

这通常是我在回溯时得到的。我试过在组合中使用不同的元素,但它总是“找不到'xxxxx'”

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"}

标签: pythonpython-3.xselenium

解决方案


好的,我找到了解决方案。可能对任何了解 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()

推荐阅读