我需要上述主题的帮助。我要附上一个屏幕截图,该图像在登录和单击几次后仍停留在网页上。 chromedriver和gekodriver都存在相同的问题。
我需要的是图像中显示的“启动”按钮。高亮显示的元素在图像中以蓝色显示,并且xpath非常简单: “ r'// * [@ id =” HME-8-widget_launch_button“]'”。
我尝试了以下操作:
driver = webdriver.Firefox();
...
Launch = r'//*[@id="HME-8-widget_launch_button"]'
link = driver.find_element_by_xpath(Launch)
act.move_to_element(link)
act.click()
act.perform()
更简单
link.click()
也不起作用。
阿尔文
答案 0 :(得分:0)
您存储在Launch
中的xPath似乎不正确。首先,如果我正确理解r'xpath'
的用法,那么它就可以使反斜杠不会转义字符。我猜您已经将act
定义为一个ActionChains,在这种情况下,您其余的代码应该可以工作,但我还是建议您
xpath = "//*[@id='HME-8-widget_launch_button']"
link = driver.find_element_by_xpath(xpath)
link.click()
如果您想重用该元素,或者如果您不需要重用它而只想单击它,则可以简单地
driver.find_element_by_xpath("//*[@id='HME-8-widget_launch_button']").click()
编辑以添加:
WAIT ..我假设您尝试单击图像中突出显示的元素正确吗?在图像的第三行上,还有另一个带有id='HME-8-widget_launch_button
的元素,该元素将首先被发现。我不能肯定地说不看完整的HTML,但是您可以使用该按钮的类来选择元素。尝试以下操作,让我知道它是否有效:
link = driver.find_element_by_css_selector("button.hm-button.k-button")
我无法对其进行测试,但这可以识别您的元素吗?
哦,我想我知道为什么您不能单击它。查看您的屏幕截图,您尝试单击的元素就在执行JavaScript之后。如果您查看该javascript,它将调用一个函数,该函数发出一个类似于以下内容的JQuery请求:
JQuery(yourElement).closest('.hm-widget').show()
closest()
和show()
here和here的JQuery文档分别表明closest('.hm-widget')
将“从当前元素开始”并“向上”。直到找到与提供的选择器匹配的DOM树”。从您的屏幕截图中,我可以看到script标记上方的第三个div有一个'hm-widget hc-button'
类,并且我相信.show()
的目标是,因此该div正在显示,覆盖了您的div,它不可点击。
请尝试以下两个建议:尝试仅单击该div并查看它是否单击了按钮。我确定您可以弄清楚自己的错误,例如:
driver.find_element_by_css_selector('div.hm-widget.hc-button').click()
或使用您喜欢的任何选择器。我认为即使执行<script>
标签后,用户也可以单击此按钮,这使我认为上面的方法可行。
如果这行不通,我想知道如果您尝试在driver.execute_javascript
中使用自己的jQuery与网站的jQuery对抗,会发生什么情况。您可以做的一件事就是尝试使用jQuery的detach
函数来简单地删除我提到的有问题的javascript。我认为可以通过以下方式实现:
css = "div.hm-widget-element > script"
scripts = driver.find_elements_by_css_selector(css)
这将从图像中存储(至少)两个scripts
组成的数组,因此scripts[0]
将标识突出显示的元素上方的脚本。以下应该从DOM中删除该标记,以便您可以(希望)单击不受阻碍的按钮。
driver.execute_script('Arguments[0].remove()', scripts[0])
如果此方法不起作用,那么最后一件事是尝试删除跟进突出显示的元素的脚本。我不完全确定该命令的作用,但似乎与您的目标元素有关。
driver.execute_script('Arguments[0].remove', scripts[1])
如果您采用这种方法,那么我将在页面加载之后以及在浏览器中执行任何操作之前添加javascript执行。
再次,我无法对其进行测试,所以让我知道如何进行。
答案 1 :(得分:0)
您可以这样使用
launchXpath = "//button[@id='HME-8-widget_launch_button']"
launchBtn = driver.find_element_by_xpath(launchXpath )
launchBtn.click()
建议:您也可以使用id
代替xpath
。