我正在尝试通过selenium和python进行一些网站测试。我填写了页面http://www.flightcentre.co.nz/并提交了表单。但现在搜索结果将我带到一个带有网址的新页面 - https://secure.flightcentre.co.nz/eyWD/results。我的网络驱动程序现在如何处理这个问题?我这是第一次这样做。任何人都可以通过提供示例或指向我这种正确的教程来帮助我。
感谢。
答案 0 :(得分:2)
好的,因为我试图回答你的另一个问题,我会试一试这个问题,尽管你并没有完全解释你想要的东西。
要记住的一件事是Selenium正在运行您的浏览器,而不是传统的Web scraper。这意味着如果网址改变它并不是什么大不了的事,那么你唯一一次必须改变你在硒中进行刮擦的方法就是弹出窗口。
您可以从其他代码中做的一件事是在寻找航班时
driver.implicitly_wait(40)//40 is the amount of seconds
这将在崩溃之前等待至少40秒,然后在页面完成加载时启动,或者在dom中激活下一个要做的任何事情。
现在,如果你想要抓住所有出现的飞行数据,这将是相当棘手的。您可以执行for循环并获取页面上的每个元素并将其写入csv文件。
class_for_departure_flight = driver.find_elements_by_xpath('//div[@class="iata"]')
for flights in class_for_departure_flight:
try:
with open('my_flights.csv', 'a', newline='') as flights_book:
csv_writer = csv.writer(flights_book, delimiter = ',')
csv_writer.writerow(flights.text)
except:
print("Missed a flight")
第二部分需要注意的是我在Python中使用CSV库来编写数据行。注意,您可以将一堆数据附加在一起,并将其写为一行,如:
data = (flights, dates, times)
csv_writer.writerow(data)
它会在电子表格的同一行中找到所有这些不同的东西。
容易错过的另外两件大事是:
class_for_departure_flight = driver.find_elements_by_xpath('//div[@class="iata"]')
即driver.find_ 元素 _by_xpath,您会注意到元素是复数,这意味着它正在查找具有相同class_name的多个对象,并将它们存储在一个数组中,以便您可以在for循环中迭代它们。
下一部分是csv_writer.writerow( flights.text ),当你迭代你的航班时,你需要抓住文本去做flight.text。如果您只使用搜索功能来执行此操作,您也可以执行此类操作。
class_for_departure_flight = driver.find_elements_by_xpath('//div[@class="iata"]').text
希望这会有所帮助!
答案 1 :(得分:1)
这是一个很好的起点:http://selenium-python.readthedocs.org/getting-started.html
以下是关于Selenium的一些事情我已经学到了很多方法:
1)当DOM刷新时,你会丢失对页面对象的引用(即从element = driver.find_element_by_id(“passwd-id”)返回,元素现在陈旧)
2)测试浅;每个测试用例应该只对页面状态进行一次断言/验证,可能是两次。这使您可以在出现故障时拍摄屏幕截图,并使您免于处理“测试失败或应用程序失败?”
3)页面上的任何JavaScript与Selenium之间存在巨大的竞争条件。当JavaScript用于刷新DOM时,使用显式等待来阻止Selenium。
要清楚,这是我使用Selenium的经验;因此并不是每个人的经验。
祝你好运!希望这有用。