
文章目录
Selenium是一个相对常见的Web应用程序自动化测试库. 它支持多种浏览器,主要用于解决搜寻器中的JavaScript渲染问题.
当请求时,urllib *无法正常获取网页内容,使用它来模拟浏览器以加载网页,并且您可以获得一些无法直接在网页源代码中看到的内容.
我使用硒及其相关库,可能已经尝试使用无头铬,无头Firefox和phantomjs. 这些无接口浏览器当然具有自己的优势,因此在这里不必过多评论.
由于selenium本机代码似乎没有post方法,因此要花很多精力来测试测试用例. 在这里,我将以无头firefox模式为例,简要讨论如何将数据发布到硒中.

以seleniumrequests为例,该库是selenium扩展,因此selenium也可以使用请求功能,我们可以使用pip来安装:
pip install selenium-requests
或者,您可以在gayhub上进行克隆:
https://github.com/cryzed/Selenium-Requests
当然selenium做爬虫,此库的使用非常简单:

# selenium.webdriver from the seleniumrequests module
from seleniumrequests import Firefox
# Simple usage with built-in WebDrivers:
webdriver = Firefox()
response = webdriver.request('GET', 'https://www.google.com/')
print(response)
但是该库也有其缺点,自定义某些驱动器模式参数很不方便,并且无法设置无头状态(也许我自己盲目尝试过). 有兴趣的朋友可以自己研究,他们的支持如下:
>>> dir(seleniumrequests)
['Android', 'Chrome', 'Firefox', 'Ie', 'Opera', 'PhantomJS', 'Remote', 'RequestMixin', 'Safari', '__builtins__', '__doc__', '__file__', '__name__', '__package__', '__path__', '__warningregistry__', 'request']
想象一下屏幕,爬上页面后,您将获得一个浏览器. 这个TM很酸.
我不太喜欢这种方法,但是有些人似乎很尊重它. 原理是解析原始的发布请求,重构传递到表单中的参数,最后将这些新生成的代码保存到html网页.

最后,程序将借用硒来定位Submit元素并触发事件提交表单.
我认为此方法不合适,每次打开网页程序时,都必须生成一个新的html文件. 无论程序是否必须具有写和删除权限,该方法本身都比较麻烦.
似乎在FB上有一篇与此方法类似的文章,因此代码不在此处发布.
Ajax模拟了发送帖子的请求,这是我自己使用的方法. 当然,效果是平均的,我相信应该会更好.
无论是本机JS中的XMLHttpRequest还是JQuery,您都可以模拟ajax发布请求,并最终使用Selenium执行JS代码.

XMLHttpRequest示例片段:
brower = webdriver.Firefox(firefox_options=fireFoxOptions)
js = """var xmlhttp=new XMLHttpRequest();
xmlhttp.open("GET","http://127.0.0.1/get.php",false);
xmlhttp.setRequestHeader("Content-type","application/x-www-form-urlencoded");
xmlhttp.setRequestHeader("User-Agent","Mozilla/5.0");
xmlhttp.setRequestHeader("Cookie","");
xmlhttp.send("test=1");
return xmlhttp.responseText;
"""
brower.implicitly_wait(30)
#time.sleep(30)
resp = brower.execute_script(js)
jquery示例片段:
jquery = open("jquery.min.js", "r").read()
driver = webdriver.Firefox(firefox_options=fireFoxOptions)
driver.execute_script(jquery)
ajax_query = '''
$.ajax('%s', {
type: %s,
data: %s,
headers: { "User-Agent": "Mozilla/5.0" },
crossDomain: true,
xhrFields: {
withCredentials: true
},
success: function(){}
});
''' % (url, request_type, data)
ajax_query = ajax_query.replace(" ", "").replace("\n", "")
resp = driver.execute_script("return " + ajax_query)
但这仍然是有缺陷的. 通过预先访问将通过driver.get请求的URL,我们可以解决跨域问题.
但是由于w3g的安全设置,我们无法自行在JS中预先设置危险的标头参数,例如cookie(跨域传输称为),Referer等.
如果我们在模糊请求数据包的标头(例如Referer)中需要一些不受欢迎的参数selenium做爬虫,则此方法将具有一定的局限性. 我暂时还没有找到其他解决方案,希望一些大个子能给我一些建议.
简而言之,很遗憾,硒没有本机发布方法,并且其浏览器调用无头模式,渲染和启动速度太慢,这很难应用于具有高并发性的单台计算机.
同样,由于其定位和特性. 我个人认为,在资源有限的情况下,它不适合用于高并发性的测试,并且效率低下和准确的模糊测试是可以接受的.
本文来自电脑杂谈,转载请注明本文网址:
https://www.pc-fly.com/a/jisuanjixue/article-153518-1.html
我给大家说个高人
怎么没见过