Javascript将位置属性更改为固定位置属性的每个样式的static

Javascript将位置属性更改为固定位置属性的每个样式的static,javascript,html,css,selenium,web-scraping,Javascript,Html,Css,Selenium,Web Scraping,在使用带有Chrome的Selenium WebDriver进行web抓取时,我遇到了一个具有固定区域的页面(它们不滚动,但相对于窗口保持固定)。通常,当我使用Actions.MoveToElement()请求web浏览器滚动到特定控件时,元素最终会被其中一个固定区域遮挡。当Selenium单击一个模糊的元素时,固定区域会窃取单击,而我的控件不会被单击 固定区域有一个class=SomeFixedPositionStyle。为了解决这个问题,我想让Selenium注入Javascript代码来遍

在使用带有Chrome的Selenium WebDriver进行web抓取时,我遇到了一个具有固定区域的页面(它们不滚动,但相对于窗口保持固定)。通常,当我使用Actions.MoveToElement()请求web浏览器滚动到特定控件时,元素最终会被其中一个固定区域遮挡。当Selenium单击一个模糊的元素时,固定区域会窃取单击,而我的控件不会被单击

固定区域有一个
class=SomeFixedPositionStyle
。为了解决这个问题,我想让Selenium注入Javascript代码来遍历页面上的每种样式,并将其修改为设置
位置:静态
(如果是
位置:固定
)。我该怎么做

我选择不修改固定元素的class属性,因为滚动页面会将class属性重置为具有固定样式的原始值

例如,看一看。当你上下滚动时,你看到顶部和底部的带子是固定的吗


当我尝试滚动到element
/*[@id=“holdingsTabs”]/ul/li[3]
时(这是“Holdings”部分中的“All”链接,它位于较低的固定区域下方,无法单击。

您可以在页面中插入样式规则

var sheet = document.styleSheets[0];
sheet.insertRule("SomeFixedPositionStyle { position: static!important; }", 1);

您可以在页面中插入样式规则

var sheet = document.styleSheets[0];
sheet.insertRule("SomeFixedPositionStyle { position: static!important; }", 1);

在这种情况下,滚动到元素视图通常会有所帮助:


您还可以通过动态更改包装器的“位置”来消除“粘性”:

var wrapper = driver.findElement(webdriver.By.css('.sticky-wrapper'));
driver.executeScript("arguments[0].style.position = null;", wrapper);

在这种情况下,滚动到元素视图通常会有所帮助:


您还可以通过动态更改包装器的“位置”来消除“粘性”:

var wrapper = driver.findElement(webdriver.By.css('.sticky-wrapper'));
driver.executeScript("arguments[0].style.position = null;", wrapper);

你能让问题重现吗?谢谢。你能让问题重现吗?谢谢。刚刚尝试了这个,它会导致屏幕滚动到“所有”链接出现在顶部固定区域的正下方。因此,顶部固定区域会捕获后续单击。当我使用Actions.MoveToElement()时它在底部固定区域下方滚动。@sevzas好的,明白了。又添加了一个选项。我还没有测试过它,但至少希望总体想法会有所帮助。谢谢。固定区域的类根据页面垂直滚动的位置在“Stick wrapper”和“Stick wrapper fixed”之间交替。我发现如果对象是“class=fixed”我可以使用driver.ExecuteScript(“参数[0].style.position='static';”,driver.FindElements(By.ClassName(“fixed”))[0])更改位置,但每次单击之前我都必须运行此代码。只要尝试一下,屏幕就会滚动到“链接显示在顶部固定区域的正下方。因此,顶部固定区域捕获后续单击。当我使用Actions.MoveToElement()时它在底部固定区域下方滚动。@sevzas好的,明白了。又添加了一个选项。我还没有测试过它,但至少希望总体想法会有所帮助。谢谢。固定区域的类根据页面垂直滚动的位置在“Stick wrapper”和“Stick wrapper fixed”之间交替。我发现如果对象是“class=fixed”我可以使用driver.ExecuteScript(“参数[0].style.position='static';”,driver.FindElements(By.ClassName(“fixed”))[0])更改位置,但每次单击之前我都必须运行此代码。似乎此解决方案要求我了解所有“fixed”“提前创建样式,对吗?如果每个样式都有“位置:已修复”,有没有一种方法可以迭代每个样式并对其进行修改?唯一的选择是循环所有元素并检查位置,这将非常昂贵。看起来您已经了解了类。有两个“已修复”我在这个页面上看到的样式,所以理论上可以尝试你的方法。因为固定区域可能会干扰任何其他站点上任何其他页面上的任何控制,所以我希望这个问题的总体解决方案当然会对开发人员社区更有利。似乎这个解决方案要求我了解所有“固定”提前创建样式,对吗?如果每个样式都有“位置:已修复”,有没有一种方法可以迭代并修改它?唯一的选择是循环所有元素并检查位置,这会很昂贵。看起来你已经知道这个类了。有两个“已修复”我在这个页面上看到的样式,所以理论上可以尝试您的方法。因为固定区域可能会干扰任何其他站点上任何其他页面上的任何控制,所以我希望这个问题的总体解决方案当然会对开发人员社区更有利。