我遇到以下任务的问题:
目前我有这个脚本:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
driver = webdriver.Firefox()
driver.get("https://google.com/")
search_form = driver.find_element_by_xpath("/html/body/div/div[3]/form/div[2]/div[2]/div[1]/div[1]/div[3]/div/div[3]/div/input[1]")
search_form.send_keys("guardian")
search_form.send_keys(Keys.ENTER)
driver.find_element_by_xpath('//a[starts-with(@href,"http://www.theguardian.com")]').click()
它成功执行前2个子任务但在最后一行抛出异常时:
selenium.common.exceptions.NoSuchElementException: Message: Unable to locate element: {"method":"xpath","selector":"//a[starts-with(@href,\"http://www.theguardian.com\")]"}
我也有这个脚本只满足最后一个子任务:
from selenium import webdriver
from selenium.webdriver.common.keys import Keys
q = "guardian"
browser = webdriver.Firefox()
body = browser.find_element_by_tag_name("body")
body.send_keys(Keys.CONTROL + 't')
browser.get("https://www.google.com/search?q=" + q + "&start=" + str(counter))
browser.find_element_by_xpath('//a[starts-with(@href,"http://www.theguardian.com")]').click()
我工作正常。我的问题是为什么第一个脚本会抛出异常,我该如何修改它,以便它像第二个脚本那样打开搜索结果?
更新
正如Bart和Shubham在评论中提到的,问题在于我试图在页面上找到尚未加载的元素。因此,解决方案是使用等待'
Selenium-webdriver提供两种类型的等待' - documentation中的显式和隐式更多内容。
对于我的解决方案,我使用隐式等待。基本上,它告诉WebDriver等待一定时间来找到一个元素,如果它不能立即可用。
为此,我只在脚本中添加了1行:
driver.implicitly_wait(5)
答案 0 :(得分:1)
可能这是因为第一个版本的元素尚未出现在页面上。如果你创建一个"等到元素存在"这种循环(不知道它是否存在于心脏中)然后它应该起作用。
第二个例子确实有效,因为只有在加载页面时,browser.get才会返回。
答案 1 :(得分:0)
您可以执行以下操作...
尝试从第一个位置等待
代码在java中,但它与python非常相似/接近,从中获取引用
您可以在HTML DOM中每次检查元素是否存在,以防止出现错误/错误的脚本。如下: -
if (driver.findElements(By.xpath('//a[starts-with(@href,"http://www.theguardian.com')).size() != 0) {
YOUR FIRST Working code
System.out.println("element exists");
}
else{
Your second working code
}
希望它会对你有所帮助:)。
答案 2 :(得分:0)
在此视频中,您可以看到如何完成: https://www.youtube.com/watch?v=IUBwtLG9hbs
转到12:30观看它的实际效果:转到google.com,在搜索框中输入内容,然后点击搜索结果。